没有删除运算符的堆对象如何调用析构函数?

时间:2018-12-07 06:42:49

标签: c++ exception new-operator

有人可以在这里解释当未调用相应的delete时如何通过new运算符为堆中创建的对象调用析构函数。 另外,由于在下面的代码中,我们通过const引用捕获对象,而在析构函数中,我们正在更改对象值(即,设置n = 0),所以这怎么可能。

class A
{
    private:
        int n;
    public:
        A()
        {
            n=100;
            std::cout<<"In constructor..."<<std::endl;
        }
        ~A()
        {
            n=0;
            std::cout<<"In destructor..."<<std::endl;
        }
};
int main()
{
  try
  {
      throw *(new A());
  }
  catch(const A& obj)
  {
      std::cout<<"Caught...."<<std::endl;
  }

 return 0;
}

程序输出(在http://cpp.sh/3jm4x上运行):

In constructor...
Caught....
In destructor...

2 个答案:

答案 0 :(得分:4)

throw复制该对象,然后在catch之后自动销毁该对象。您观察到的正是这种破坏。实际上,原始的堆分配对象从未被销毁。

答案 1 :(得分:3)

您实际上有内存泄漏,因为被调用的析构函数不适用于new分配的对象。

throw *(new A());生成对象的副本,您可以看到该副本构造函数已被调用。这是在catch范围的结尾处调用析构函数的对象。

您可以查看实时演示here