受保护析构函数对象在堆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;

最新更新