[英]Why does a memory leak occur in this code when a bad_alloc exception is thrown for T2
如果 T2 要抛出,为什么这会导致 T1 出现 memory 泄漏?
// 在一些 header 文件中: void f( T1*, T2* );
// 在某个调用点: f( new T1, new T2 );
如果第二个对象的构造函数抛出异常,则f()
不会被调用,因此f()
中的代码将没有机会删除创建的第一个 object,或存储指向该 object 的指针供以后删除。
同样,在引发异常后可能执行的代码(例如,在您可能设置为处理异常的任何catch
处理程序块中)将无法访问指向 object 的指针,因此它将无法删除创建的 object 或者。
因此,在这种情况下,object 或多或少(*)不可避免地会泄漏。
(请注意,未指定首先评估哪个函数参数,因此它很容易在创建T2
后引发T1()
,从而导致T2
object 被泄露)
(*) 我想你可以做一些疯狂的事情,比如让T1()
和T2()
构造函数中的最后一行将它们的this
指针存储到 static 数据结构的某个地方,但这真的很难看,并引入了许多其他的问题; 解决此问题的正确方法是使用std::unique_ptr
或类似的“捕获”对象,以便永远不需要显式delete
调用,因此无论何时抛出异常都不会发生 memory 泄漏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.