如果析构函数受到保护,为什么不允许在堆栈上分配对象,但是允许在堆上分配?
class Foo
{
public:
Foo()
{
}
protected:
~Foo()
{
}
};
int main()
{
Foo* objOnHeap = new Foo(); // compiles fine
Foo objOnStack; // complains that the destructor is protected
return 0;
}
答案 0 :(得分:3)
当您创建具有自动存储持续时间的对象(您在堆栈上调用的标准术语)时,当对象超出范围时,它将被隐式销毁。这需要一个可公开访问的析构函数。使用new
动态分配对象时,不会发生这种情况。只有明确地执行动态分配的对象(例如,使用delete
),才会销毁动态分配的对象。你不是试图这样做,所以你不会得到错误。如果你这样做,你会收到错误:
delete objOnHeap;