2016-09-13 3 views
1

소멸자가 보호되는 경우 왜 스택에 객체를 할당 할 수 없지만 힙에 할당 할 수 있습니까? 당신이 자동 저장 기간 (당신이 "스택에"라고 부릅니다의 표준 용어)와 객체를 만들 때힙 대 스택에서 소멸자가 객체 할당을 보호

class Foo 
{ 
    public: 
    Foo() 
    { 
    } 
    protected: 
    ~Foo() 
    { 
    } 
}; 

int main() 
{ 
    Foo* objOnHeap = new Foo(); // compiles fine 
    Foo objOnStack; // complains that the destructor is protected 
    return 0; 
} 
+2

당신이 delete''에 의해 그것을 파괴하지 않는 때문에는 dtor는 전혀 호출되지 않습니다. – songyuanyao

+0

힙에있는 객체에 대해'delete'를 호출하지 않았습니다. 스택에있는 객체의 경우 범위를 벗어나면 삭제됩니다. – arunmoezhi

+0

예. 이것이 차이점입니다. dtor가 호출되는지 여부. (암시 적으로 또는 명시 적으로 중요하지 않음) – songyuanyao

답변

3

,이 암시 적으로 파괴 된 개체가 범위를 벗어나면. 이렇게하려면 공개적으로 액세스 가능한 소멸자가 필요합니다. new을 사용하여 개체를 동적으로 할당하면이 작업이 수행되지 않습니다. 동적으로 할당 된 객체는 명시 적으로 수행하는 경우에만 삭제됩니다 (예 : delete). 당신은 그렇게하려고하지 않으므로 오류가 발생하지 않습니다. 당신이 이런 짓을하면 오류를 얻을 것이다 :

delete objOnHeap; 
+0

아 .. 말이 되네. 감사. – arunmoezhi

+0

좋은 설명. 이 ** std :: unique_ptr p (new Foo()); **는 내부에서 delete를 사용하기 때문에 불평합니다. – blackpen

관련 문제