2012-02-07 2 views
1

이 질문이 Does calling a destructor explicitly destroy an object completely?인데,이 상황은 코드에 나와 있습니다.소멸자를 수동으로 호출 한 후 어떻게 메모리를 삭제합니까?

Object* aWidget = new Widget(); //allocate and construct 
aWidget->~Object();    //destroy and DON'T deallocate 

답변에서 나는이 상황에서 실제로 메모리 영역이 할당 해제되지 않았 음을 밝힙니다. 내 질문은 (무엇보다 호기심에서) :

위 코드 두 줄을 실행 한 후에 위젯이 가리키는 메모리를 삭제하려면 어떻게해야합니까? 내가 이미 delete aWidget; 호출하면 이미 파괴 된 개체에 소멸자를 실행하려고하기 때문에 실패 할 것이라고 가정합니다. free(aWidget) 또는 그 대신 메모리를 대상으로 호출 할 수 있습니까?

+0

나는 내가 주석으로 게시하도록하겠습니다 확실하지 않다,하지만 당신은'연산자 (aWidget)을 삭제'호출 할 수 있습니다. 비록 유효한 유즈 케이스로서이 문제에 부딪히는 코드를 보게된다면 궁금 할 것이다. –

+0

@ CoryNelson 당신 말이 맞아요, 제 대답을보십시오. 나는 당신이 코멘트를 올렸을 때 그것을 타이핑했다. –

답변

3

free 실제로는 내 추측이 될 것입니다. 그러나 나는 UB를 호출하지 않고 무엇이든을 할 수 있다고 생각하지 않습니다. 그런 소멸자를 호출하기위한 요구 사항에 어떻게 도달 했습니까?

+0

나는 실제로 나는 인용 한 질문을 읽고 그들이 걸어온 상황을 어떻게 고칠 지 궁금해했다. 새로운 프로그램을 사용하는 프로그램에서 이런 소멸자 호출을 보았습니다. –

+0

@ w00te : 예, 위치가 새로운 것과 다릅니다.) –

1

new으로 할당 된 개체의 free을 호출하면 정의되지 않은 동작이 입니다.

간단하게 작성하고 delete으로 전화하는 것이 좋습니다.

그러나 이전에 소멸자를 명시 적으로 호출 한 경우에도 으로, 어떤 경우에는 delete으로 호출 할 수 있습니다. 명시 적으로 호출하면 함수로 볼 수 있습니다. 메모리는 해제되지 않으므로, 당신이 그들을 파괴 한 후에 NULL에 회원 포인터를 설정하는 것이 짐작 될 수 있습니다. (왜냐하면 NULL 포인터에서 delete을 호출하는 것이 no-op이기 때문입니다).

예를 들어, 다음은 확인을해야 :

class A 
{ 
public: 
    int * x; 
    A() 
    { 
     x = new int[10]; 
    } 
    ~A() 
    { 
     delete[] x; 
     x = NULL; 
    } 
}; 

int main() 
{ 
    A* a = new A; 
    a->~A(); 
    delete a; 
    return 0; 
} 
관련 문제