如果析构函数是受保护的,为什么不允许在堆栈上分配对象,而允许在堆上分配对象?
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;