如果我有一个类,A
并且某些机构使用我的代码创建的对象A
,则在DoSth()
不使用的情况下调用try-catch
,是否会导致内存泄漏?valgrind的报告中可能丢失并仍可访问的消息是否表示内存泄漏?如果没有,如何避免它们?而且,的构造函数A
不安全吗?我必须在这里使用智能指针替换原始指针Animal*
吗?还有一种称为“复制和交换”的策略,何时使用?由于new运算符可能会引发异常,因此当我要在堆上动态分配内存时,我几乎不感到困惑。
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
Valgrind的报告显示了潜在的内存泄漏,因为您让异常气泡上升到应用程序级别,这杀死了应用程序。然后释放资源。
但是,需要注意一些事项:
1)如果某个函数有可能引发异常,则应在达到应用程序级别之前处理该异常(在该级别,该异常将杀死您的应用程序-异常的想法是允许您优雅地处理错误)。
2)为什么要Animal
在堆上分配?在此设置中,可以很容易地将其分配到堆栈上,在这种情况下,Valgrind中也不会显示潜在的泄漏。
如果您担心new
引发异常(实际上,这种情况通常仅在内存不足以进行分配时才会发生……所以不是很常见),则需要在单独的函数中定义初始化(即使智能指针也不会)避免为您解决该问题),或者在构造函数中有一个try-catch块,或者不要放在Animal
堆上。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句