我试图了解构造函数引发异常时会发生什么问题。
例如,这段代码的一部分:
#include <iostream>
class X
{
public:
X(int);
~X();
private:
int* m;
};
X::X(int y)
{
m = new int(y);
throw std::exception();
}
X::~X()
{
delete m;
std::cout << "Destructor" << std::endl;
}
//---------------------------------------
int main()
{
try
{
X a(4);
}
catch (const std::exception&)
{
std::cout << "ex" << std::endl;
}
system("pause");
// output
/* ex
Press any key to continue . . .
*/
}
没有调用析构函数,因此是内存泄漏!
1)是否可以在不使用任何智能指针的情况下解决此问题?
2)我的主要问题是,当构造函数引发异常时(例如,当我们具有类的层次结构或可能引发异常的类成员时)会发生什么问题?
答案 0 :(得分:0)
我的主要问题是构造函数抛出异常时会出现什么问题
就像一般的抛出一样,构造函数没有特定的细节。
C ++设计为在构造函数中抛出异常。
您的示例:
m = new int(y);
throw std::exception();
在任何地方都不好。
使用:
auto m = std::make_unique<int>(y);
throw std::exception();
相反。