感谢所有的回复.
我重新格式化了我的问题,以便在包含类的构造函数抛出异常之后理解成员指针的状态
我的示例类:)
class Foo
{
public:
Foo()
{
int error = 0;
p = new Fred;
throw error; // Force throw , trying to understand what will happen to p
}
~Foo()
{
if (p)
{
delete p;
p = 0;
}
}
private:
Fred* p;
};
int main()
{
try
{
Foo* lptr = new Foo;
}
catch (...)
{}
}
Run Code Online (Sandbox Code Playgroud)
类foo的consturctor会因某些随机原因而抛出异常.我知道foo的desturctor永远不会被调用,但在这种情况下,p的析构函数会被调用吗?
将p作为增强智能指针而不是指向fred的原始指针有什么不同.
谢谢.
这里有一个类似的问题,涵盖了你的要求.
在这种情况下,如果调用new
失败,则保证释放指针的内存.如果调用成功,并且构造函数在此之后抛出,则会发生内存泄漏.
不会调用类的析构函数,因为该对象从未完全构造.有两种方法可以解决这个问题.
1)
在构造函数中完全管理异常:
class Foo
{
public:
Foo()
try
{
p = new p;
throw /* something */;
}
catch (...)
{
delete p;
throw; //rethrow. no memory leak
}
private:
int *p;
};
Run Code Online (Sandbox Code Playgroud)
2)
或者使用智能指针.输入构造函数时,已构造其所有成员.并且因为当构造函数抛出并且构造了对象成员时,它们必须被破坏.智能指针修复了:
class Foo
{
public:
Foo() :
p(new int)
{
throw /* something */;
}
private:
std::auto_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7437 次 |
最近记录: |