如果我有一个类A,并且某个主体使用我的代码创建了一个A对象,那么在没有try-catch的情况下调用DoSth(),内存会泄漏吗?在瓦兰的报告中,是否可能丢失并仍可联系到内存泄漏?如果没有,该如何避免呢?而且,A的构造函数是不安全的,对吗?我必须使用智能指针替换原始指针Animal*吗?有一种叫"copy-and-swap",的策略是什么时候使用它?因为新操作符可能会抛出异常,所以当我想在堆上动态分配内存时,我不太明白该做什么。
代码
class A
{
public:
A(const string& petname, int petage)
:pet_(new Animal(petname, petage))
{
}
~A()
{
delete pet_;
}
void DoSth()
{
// do sth...
throw;
}
private:
Animal* pet_;
};
int main(int argc, char const *argv[])
{
A a("Kitty", 3);
a.DoSth();
return 0;
}瓦莱尔报告
==2799== LEAK SUMMARY:
==2799== definitely lost: 0 bytes in 0 blocks
==2799== indirectly lost: 0 bytes in 0 blocks
==2799== possibly lost: 30 bytes in 1 blocks
==2799== still reachable: 16 bytes in 1 blocks
==2799== suppressed: 0 bytes in 0 blocks发布于 2013-09-16 14:13:43
Val差伦的报告显示了潜在的内存泄漏,因为您让异常气泡上升到应用程序级别,从而扼杀了应用程序。然后释放这些资源。
然而,需要注意的是:
1)如果函数有抛出异常的潜力,则应该在该异常到达应用程序级别之前处理它(在该级别上,异常会杀死应用程序--异常的思想是允许您优雅地处理错误)。
2)为什么要在堆中分配Animal?在这个设置中,可以很容易地在堆栈上分配它,在这种情况下,您也不会有一个潜在的泄漏显示在瓦兰。
如果您担心new抛出一个异常(在实践中,这通常只在内存耗尽以进行分配时才发生.因此,通常情况下,您需要在单独的函数中定义初始化(即使是智能指针也不会为您避免这个问题),或者在构造函数中有一个try-catch块,或者不要将Animal放到堆中。
https://stackoverflow.com/questions/18829781
复制相似问题