ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 如何在没有删除运算符的情况下为堆对象调用析构函数?

2019-07-27 01:05:05  阅读:180  来源: 互联网

标签: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...

解决方法:

throw生成对象的副本,然后在catch之后自动销毁.你观察到的是这种破坏.原始的堆分配对象确实永远不会被销毁.

标签:c,exception,new-operator
来源: https://codeday.me/bug/20190727/1549047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有