堆与堆栈上受保护的析构函数对象分配

时间:2016-09-13 02:14:00

标签: c++

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

class Foo
{
  public:
  Foo()
  {
  }
  protected:
  ~Foo()
  {
  }
};

int main()
{
  Foo* objOnHeap = new Foo(); // compiles fine
  Foo objOnStack; // complains that the destructor is protected
  return 0;
}

1 个答案:

答案 0 :(得分:3)

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

delete objOnHeap;