受保护的堆对象堆栈vs堆栈分配

问题描述:

如果析构函数受到保护,为什么不允许在堆栈上分配对象,但在堆上分配是允许的?受保护的堆对象堆栈vs堆栈分配

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

因为你不是通过'删除'摧毁它,dtor将不会被调用。 – songyuanyao

+0

我没有为堆上的对象调用'delete'。对于堆栈中的对象,当它超出范围时会被删除。 – arunmoezhi

+0

是的,这是区别;该dtor是否被调用。 (隐含或明确无关紧要) – songyuanyao

当创建具有自动存储时间(标准的术语,你所谓的“堆栈”)的对象,它是隐式销毁当对象超出范围。这需要一个可公开访问的析构函数。当您使用new动态分配对象时,这不会发生。动态分配的对象只有在明确使用时才会被销毁(例如使用delete)。你并没有试图这样做,所以你不会有错误。你会得到一个错误,如果你这样做:

delete objOnHeap; 
+0

啊..有道理。谢谢。 – arunmoezhi

+0

很好的解释。即使这个** std :: unique_ptr p(new Foo()); **会抱怨,因为它使用里面的delete。 – blackpen