2013-11-28 2 views
1

클래스의 소멸자에서이 포인터를 삭제하면 어떤 일이 발생하는지 확인하기 위해 프로그램을 작성했습니다. 다음은 내 코드입니다소멸자 (this) 포인터 삭제

class xxx{ 
    public: xxx(){cout<<"constructor called"<<endl;} 
      ~xxx(){cout<<"destructor called"<<endl;delete(this);} //deleting the 'this' pointer 
}; 
int main(int argc, char *argv[]) 
{ 
    xxx *x1=new xxx(); 
    delete x1; 
    return 0; 
} 

이 프로그램을 실행하면 "desctructor called"라는 무한 루프 인쇄가 발생합니다.

+4

나는 이것이 어떤 식 으로든 당신을 놀라게한다는 것에 놀랐습니다. – JustSid

+2

스택 오버플로에 재귀 자살과 같은 것은 없습니다. – Mysticial

+5

여기에도 질문이 있습니까? –

답변

4

this->~destructor이 호출되면 delete(this)은 다시 this->~destructor을 호출하므로 함수를 무기한 호출합니다.

2

물론 무한 루프 (또는 스택 오버플로)가 발생합니다. delete은 메모리를 할당 해제하기 전에 소멸자를 호출하므로, 이미 삭제 된 객체를 삭제하려고 시도하면 재귀 적으로 나선형이됩니다.

간단한 해결책은 다음과 같습니다.

+0

스택 오버 플로우가 발생하지 않습니다. – Raxvan

+1

@Raxvan : 꼬리 호출 최적화가 적용되지 않는 한. –

+0

실제로 릴리스에서 최적화되지만 디버그에서는 (VS2013 이상) 최적화되지 않습니다. – Raxvan