受保护的堆对象堆栈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;
}
答
当创建具有自动存储时间(标准的术语,你所谓的“堆栈”)的对象,它是隐式销毁当对象超出范围。这需要一个可公开访问的析构函数。当您使用new
动态分配对象时,这不会发生。动态分配的对象只有在明确使用时才会被销毁(例如使用delete
)。你并没有试图这样做,所以你不会有错误。你会得到一个错误,如果你这样做:
delete objOnHeap;
+0
啊..有道理。谢谢。 – arunmoezhi
+0
很好的解释。即使这个** std :: unique_ptr
因为你不是通过'删除'摧毁它,dtor将不会被调用。 – songyuanyao
我没有为堆上的对象调用'delete'。对于堆栈中的对象,当它超出范围时会被删除。 – arunmoezhi
是的,这是区别;该dtor是否被调用。 (隐含或明确无关紧要) – songyuanyao