【发布时间】:2021-07-07 18:58:20
【问题描述】:
异常后未调用 B 构造函数存在内存泄漏。 如果构造函数分配了其他类的对象,并且如果在某些时候发生异常,它需要释放所有先前分配的对象,或者有办法自动管理这个,那么在构造函数中处理异常的最佳方法是什么。
#include <iostream>
#include<utility>
using namespace std;
class A
{
private:
int *eleA;
public:
A()
{
eleA = new int;
//*eleA = 0;
cout<<"Constructor A\n";
}
~A()
{
cout<<"Destructor A \n";
delete eleA;
eleA = nullptr;
}
};
class B
{
private:
int *eleB;
public:
B()
{
cout<<"Constructor B\n";
eleB = new int;
//*eleB = 0;
throw -1; //Exception thrown
}
~B()
{
cout<<"Destructor B \n";
delete eleB;
eleB = nullptr;
}
};
class AB
{
private:
A *a_ptr;
B *b_ptr;
public:
AB() : a_ptr(nullptr),b_ptr(nullptr)
{
try{
cout<<"Constructor AB \n";
a_ptr = new A;
b_ptr = new B;
}
catch(int a)
{
cout<<"Exception catched\n";
}
}
~AB()
{
cout<<"Destructor AB \n";
if (a_ptr)
{
delete a_ptr;
a_ptr = nullptr;
}
if (b_ptr)
{
delete b_ptr;
b_ptr = nullptr;
}
}
};
int main()
{
AB *ab = new AB;
delete ab;
return 0;
}
输出:
构造函数 AB
构造函数A
构造函数 B
捕捉到异常
析构函数 AB
析构函数A
【问题讨论】:
-
使用智能指针不用担心
-
这是一个最好的例子,为什么你应该使用智能指针
-
而
eleA = 0;并没有像你想象的那样做。 -
感谢更正
-
由于
new和它的使用是一个非常高级的话题,我建议你使用智能指针和容器,只有在掌握它们之后才考虑是否使用new。 (除非您正在制作自己的自定义智能指针或棘手的容器,否则您可能永远不需要使用new。)