C++智能指针通过RAII机制自动管理内存,避免泄漏;std::unique_ptr独占所有权,不可复制但可移动,适用于单一所有者场景;std::shared_ptr采用引用计数实现共享所有权,支持多指针共享同一对象,析构时自动释放资源;为防止循环引用导致内存泄漏,应使用std::weak_ptr打破循环,其不增加引用计数,仅临时观察对象状态;推荐优先使用unique_ptr,共享时选用shared_ptr配合weak_ptr,并通过make_unique和make_shared创建以提升性能与安全。

智能指针是 C++ 中用于自动管理动态内存的工具,能有效避免内存泄漏和资源泄露。它们通过 RAII(Resource Acquisition Is Initialization)机制,在对象生命周期结束时自动释放资源。C++ 标准库提供了 std::unique_ptr 和 std::shared_ptr 两种主要的智能指针类型,下面详细说明它们的用法和特点。
std::unique_ptr:独占式所有权
std::unique_ptr 表示对所指向对象的唯一所有权。同一时间只能有一个 unique_ptr 指向某个对象,不能复制,但可以移动。
适合用于“谁创建谁销毁”的场景,比如函数返回动态分配的对象、类成员管理资源等。
基本用法:使用 std::make_unique 创建(C++14 起推荐) 析构时自动调用 delete 不支持拷贝构造和赋值,但支持移动语义
示例:
立即学习“C++免费学习笔记(深入)”;
#include #include int main() { std::unique_ptr ptr = std::make_unique(42); std::cout << *ptr << 'n'; // 输出 42 // 移动所有权 std::unique_ptr ptr2 = std::move(ptr); // 此时 ptr 为空,ptr2 拥有对象 if (!ptr) { std::cout << "ptr is nulln"; } return 0;}
注意事项:不要将同一个原始指针多次交给不同的 unique_ptr 避免手动调用 release(),除非你清楚自己在做什么 可以用自定义删除器处理非内存资源(如文件句柄)
std::shared_ptr:共享式所有权
std::shared_ptr 实现引用计数,多个 shared_ptr 可以共享同一个对象。当最后一个引用被销毁时,对象自动释放。
适用于需要多处访问同一资源的场景,比如缓存、观察者模式、树结构中的节点共享等。
基本用法:使用 std::make_shared 创建(更高效,推荐) 内部维护引用计数,拷贝或赋值会增加计数 析构时减少计数,为 0 时释放资源
示例:
立即学习“C++免费学习笔记(深入)”;
#include #include void func(std::shared_ptr p) { std::cout << "In func: ref count = " << p.use_count() << 'n';}int main() { auto sp = std::make_shared(100); std::cout << "ref count = " << sp.use_count() << 'n'; // 1 { auto sp2 = sp; // 引用计数 +1 std::cout << "ref count = " << sp.use_count() << 'n'; // 2 func(sp2); // 传参再 +1 } // sp2 离开作用域,计数减回 1 std::cout << "ref count = " << sp.use_count() << 'n'; // 1 return 0;}
性能提示:make_shared 比直接 new 更快,因为它一次性分配控制块和对象内存 频繁拷贝 shared_ptr 会有原子操作开销(线程安全)
避免循环引用:使用 weak_ptr
当两个 shared_ptr 相互持有对方时,会导致引用计数永不归零,造成内存泄漏。
解决方法是使用 std::weak_ptr —— 它不增加引用计数,只是临时观察对象是否存在。
示例:
立即学习“C++免费学习笔记(深入)”;
#include struct Node { std::shared_ptr parent; std::weak_ptr child; // 避免循环};auto node1 = std::make_shared();auto node2 = std::make_shared();node1->child = node2;node2->parent = node1; // 正常引用// 不会形成循环引用,node2 的 child 是 weak_ptr
访问 weak_ptr 前需检查是否有效:
if (auto p = weak_ptr.lock()) { // p 是 shared_ptr,可安全使用} else { // 对象已释放}
选择合适的智能指针
大多数情况下优先用 unique_ptr:性能高、语义清晰 需要共享所有权时用 shared_ptr 配合 weak_ptr 打破循环引用 尽量使用 make_unique 和 make_shared,避免裸 new基本上就这些。掌握这三种指针,就能写出安全高效的 C++ 内存管理代码。
以上就是c++++ 智能指针怎么用 c++ shared_ptr unique_ptr详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486279.html
微信扫一扫
支付宝扫一扫