2013-07-25 2 views
0

클래스의 소멸자를 자체 메서드에서 호출 할 수 있는지 알고 싶습니다. 예를 들어 은 마무리가 foo의 소멸자를 호출하고 메모리를 복구하는 것이 가능하다 지금 foofinalize메서드 내에서 자체 소멸자 호출

void foo::finalize() 
{ 
    //do some finalizing code 
    //Delete the instance; 
} 

라는 메소드를 가지고 생각 나는 그런

foo* f = new foo(); 

로 생성 클래스 foo는이 말을 그 new에 의해 할당 되었습니까? 그렇다면 어떻게?

+0

경고 : 소멸자를 호출하고 메모리를 해제 혼동하지 마십시오 ... – hivert

+0

경고 :'호출하지 아니 었'foo'에') (마무리 결코해야 new에 의해 할당된다. – Casey

답변

3

당신은 foo는의 소멸자를 호출합니다 this->~foo(); 퍼팅하는 방법

+1

하지만 객체가 동적으로 할당 된 경우에만 유효하다는 대규모주의 사항이 있습니다. 따라서 동적 할당을 강제하지 않는 클래스 (예 : private 생성자 및 팩토리 메소드)에서'delete this '를 호출하면 거대한 코드 냄새가 난다. –

+0

예. OP는 "나는 동적 할당을 통해 클래스 foo를 만들었다"고 말했다. 그러나 당신은 명백 할 권리가 있습니다. 나는이 일을 옹호하지는 않지만 질문에 대답했습니다 :) – cdmh

2

소멸자를 직접 호출하지 않으므로 delete this을 호출하여 소멸자를 호출합니다. 어느 쪽이든이 패턴은 COM과 같은 참조 계산 된 프레임 워크에서 광범위하게 사용되므로 대답은 매우 명확합니다.

0

내에서 개체를 삭제하는 delete this;를 호출 할 수 있습니다.

그래서,

void foo::finalize() 
{ 
    // do something 
    this->~foo(); 
} 
+3

예,하지만 메모리를 복구하지는 못합니다. –

+4

@MarkRansom'new'에 의해 할당 된 메모리를 해제하지 않지만, 클라이언트 코드가'delete'를 호출하는 것을 불가능하게 만듭니다. 이것은 새로운 배치를 사용하지 않는 한 당신이해야 할 일이 아닙니다. –

+0

@ MarkRansom 아, 감사합니다. – al92

관련 문제