为什么当为T2抛出bad_alloc异常时,此代码中会发生内存泄漏

Why does a memory leak occur in this code when a bad_alloc exception is thrown for T2

本文关键字:代码 泄漏 内存 T2 抛出 bad 异常 alloc 为什么      更新时间:2023-10-16

如果T2抛出,为什么会导致T1内存泄漏?

//在某些头文件中:空隙f(T1*,T2*(;

//在某些呼叫站点:f(新T1,新T2(;

如果第二个对象的构造函数抛出异常,那么f()将不会被调用,因此f()内的代码将没有任何机会删除创建的第一个对象,也没有任何机会存储指向该对象的指针以供以后删除。

类似地,可能在引发异常后执行的代码(例如,在您可能设置用于处理异常的任何catch处理程序块中(将无法访问指向任一对象的指针,因此也无法删除创建的对象。

因此,在这种情况下,对象或多或少不可避免地会泄漏。

(请注意,没有指定哪个函数参数将首先求值,因此在创建T2后抛出T1()也很容易,从而导致T2对象泄漏(

(*(我想你可以做一些疯狂的事情,比如让T1()T2()构造函数中的最后一行将它们的this-指针存储到某个静态数据结构中,但这会非常难看,并引入许多其他问题;这个问题的正确解决方案是使用std::unique_ptr或类似的方法来"捕获"对象,这样就不需要显式的delete调用,因此无论何时抛出异常,都不可能发生内存泄漏。