7

我读了一本手册说(见http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared):

此外,f(shared_ptr<int>(new int(42)), g())如果 g 抛出异常,可能会导致内存泄漏。如果使用 make_shared 则不存在此问题。

为什么会导致内存泄漏?

4

1 回答 1

19

允许编译器按以下顺序评估该表达式:

auto __temp1 = new int(42);
auto __temp2 = g();
auto __temp3 = shared_ptr<int>(__temp1);
f(__temp3, __temp2);

你可以看到如果g()抛出,那么分配的对象永远不会被删除。

使用make_shared,在分配对象和初始化智能指针以管理它之间没有任何关系。

于 2013-09-26T17:20:17.387 回答