C++中4种智能指针简单总结

2023-02-07 15:41:15 1220人已围观 41已点赞 2人已收藏

简介本文对C++中4种智能指针使用进行简单总结:auto_ptr、unique_ptr、shared_ptr和weak_ptr这4种智能指针。感兴趣的朋友可以参考一下。

为何要使用智能指针

解决C++内存泄漏最有效的办法就是使用智能指针(Smart Pointer)。使用智能指针就不用担心这个问题了,因为智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放,这样就不用担心内存泄漏的问题了。

C++提供了auto_ptr、unique_ptr、shared_ptr 和 weak_ptr 这几种智能指针(auto_ptr 是 C++98 提供的解决方案,C+11 已将将其摒弃,并提供了另外两种解决方案。)在此这里只介绍后三个智能指针:

(1)shared_ptr 共享的智能指针:

shared_ptr 使用引用计数,每一个 shared_ptr 的拷贝都指向相同的内存。在最后一个 shared_ptr 析构的时候,内存才会被释放。

注意事项:

  • 不要用一个原始指针初始化多个 shared_ptr 。
  • 不要再函数实参中创建 shared_ptr,在调用函数之前先定义以及初始化它。
  • 不要将 this 指针作为 shared_ptr 返回出来。
  • 要避免循环引用。

(2)unique_ptr 独占的智能指针:

Unique_ptr 是一个独占的智能指针,他不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个 unique_ptr 赋值给另外一个 unique_ptr 。

unique_ptr 不允许复制,但可以通过函数返回给其他的 unique_ptr,还可以通过 std::move 来转移到其他的 unique_ptr,这样它本身就不再拥有原来指针的所有权了。

如果希望只有一个智能指针管理资源或管理数组就用 unique_ptr,如果希望多个智能指针管理同一个资源就用 shared_ptr 。

(3)weak_ptr 弱引用的智能指针:

弱引用的智能指针 weak_ptr 是用来监视 shared_ptr 的,不会使引用计数加一,它不管理 shared_ptr 内部的指针,主要是为了监视 shared_ptr 的生命周期,更像是 shared_ptr 的一个助手。 weak_ptr 没有重载运算符*和->,因为它不共享指针,不能操作资源,主要是为了通过 shared_ptr 获得资源的监测权,它的构造不会增加引用计数,它的析构不会减少引用计数,纯粹只是作为一个旁观者来监视 shared_ptr 中关连的资源是否存在。 weak_ptr 还可以用来返回 this 指针和解决循环引用的问题。


更多为你推荐