有人可以在这里解释当没有调用相应的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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。