C++11引入智能指针解决内存管理问题,unique_ptr独占所有权并自动释放资源,shared_ptr通过引用计数实现共享所有权,weak_ptr打破循环引用,推荐使用make_unique和make_shared创建智能指针以提升安全性。

在 C++ 中,手动管理内存容易引发内存泄漏、重复释放等问题。为了解决这些问题,C++11 引入了智能指针,主要包括 std::unique_ptr 和 std::shared_ptr,它们能自动管理动态分配的对象生命周期,确保资源安全释放。
std::unique_ptr:独占所有权的智能指针
std::unique_ptr 表示对对象的独占所有权,同一时间只能有一个 unique_ptr 指向某个对象。当 unique_ptr 被销毁时,它所管理的对象也会被自动删除。
使用场景:当你需要动态分配对象且不希望多个指针共享该对象时,应优先使用 unique_ptr。
基本用法:
立即学习“C++免费学习笔记(深入)”;
通过 std::make_unique 创建(C++14 起推荐方式) 不能复制,但可以移动(move) 离开作用域时自动释放内存
#include #include int main() { auto ptr = std::make_unique(42); std::cout << *ptr << "n"; // 输出 42 // 移动所有权 auto ptr2 = std::move(ptr); // 此时 ptr 为空,ptr2 拥有对象 return 0;} // ptr2 离开作用域,自动 delete
std::shared_ptr:共享所有权的智能指针
std::shared_ptr 实现引用计数机制,多个 shared_ptr 可以共享同一个对象。只有当最后一个 shared_ptr 被销毁时,对象才会被释放。
使用场景:多个模块或函数需要共享同一个对象时使用。
基本用法:
立即学习“C++免费学习笔记(深入)”;
通过 std::make_shared 创建(更高效) 支持拷贝,每拷贝一次引用计数加一 引用计数归零时自动释放资源
#include #include void use_ptr(std::shared_ptr p) { std::cout << "引用计数: " << p.use_count() << "n";}int main() { auto sptr = std::make_shared(100); std::cout << "初始引用计数: " << sptr.use_count() << "n"; { auto sptr2 = sptr; // 引用计数 +1 std::cout << "复制后引用计数: " << sptr.use_count() << "n"; use_ptr(sptr2); // 再次增加临时引用 } // sptr2 销毁,引用计数 -1 return 0;} // sptr 销毁,引用计数归零,释放内存
避免循环引用:使用 weak_ptr
当两个 shared_ptr 相互持有对方时,会导致引用计数无法归零,形成内存泄漏。这时应使用 std::weak_ptr 打破循环。
weak_ptr 不增加引用计数,只是一个“观察者”,访问前需检查对象是否还存在。
#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; // 形成父子关系,但 child 是 weak_ptr// 正常析构,不会泄漏
基本上就这些。合理使用 unique_ptr 和 shared_ptr,配合 make_unique / make_shared,能极大提升代码安全性与可维护性。注意避免裸 new/delete,优先让智能指针接管资源管理。
以上就是C++ 如何使用智能指针 (shared_ptr, unique_ptr)_C++ 智能指针用法与内存管理的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486197.html
微信扫一扫
支付宝扫一扫