【发布时间】:2020-11-02 19:56:16
【问题描述】:
这个程序是否有内存泄漏,如果是,那么如何解决这个问题??
#include<iostream>
using namespace std;
class A
{
double a,b;
public:
A(double X,double Y)
{
try
{
a = X;
b = Y;
if(b==0)
throw b;
else
cout <<"Division:"<<a/b<<endl;
}
catch (double z)
{
throw z;
}
}
~A()
{
cout<<"Object Destroyed"<<endl;
}
};
int main()
{
try
{
A object(10,2);
A object1(4,2);
A object2(4,0);
}
catch(double a)
{
cout<<"Zero:"<<a<<endl;
}
return 0;
}
对于 Object2,为什么不调用析构函数,如果有任何从构造函数抛出异常的最佳方法是什么?
【问题讨论】:
-
我没有看到任何内存泄漏。
-
object2 永远不会被构造,所以没有什么可以破坏
-
catch (double z) { throw z; }似乎毫无意义。如果这就是你所做的一切,为什么还要使用try/catch? -
@RoseAhmed “为什么不为 object2 调用析构函数??” - 因为对象从未完全构造,构造函数抛出异常,所以没有对象可以调用析构函数。
-
@RoseAhmed:
object和object1将被完全构造和破坏。object2不会完成构造,由于异常,所以不调用析构函数。虽然没有内存泄漏。object2可能存在内存泄漏的风险,但解决方案是使用 RAII 成员,不要自己使用new。