C++如何正确使用智能指针?看完这4个点你就明白了( 六 )

但是如果 w->do_something()发生了异常 , 那么delete w将不会被执行 。 此时就会发生内存泄漏 。 我们当然可以使用 try...catch 捕捉异常 , 在 catch 里面执行 delete , 但是这样代码上并不美观 , 也容易漏写 。

如果我们用 std::unique_ptr , 那么这个问题就迎刃而解了 。 无论代码怎么抛异常 , 在 unique_ptr 离开函数作用域的时候 , 内存就将会自动释放 。

shared_ptr:共享所有权

在使用 shared_ptr 之前应该考虑 , 是否真的需要使用 shared_ptr 而非 unique_ptr 。

shared_ptr 代表的是共享所有权 , 即多个 shared_ptr 可以共享同一块内存 。 因此 , 从语义上来看 , shared_ptr 是支持复制的 。 如下:

auto w = std::make_shared<Widget>();
{
auto w2 = w;
cout << w.use_count() << endl; // 2

推荐阅读