首页 > 后端开发 > C++ > 正文

C++智能指针怎么使用 unique_ptr shared_ptr实践指南

P粉602998670
发布: 2025-07-16 09:49:01
原创
646人浏览过

c++++智能指针的使用关键在于理解适用场景。1. 优先使用unique_ptr管理独占资源,适用于生命周期明确、无需共享的对象,不可复制但可移动,适合函数内创建并返回对象的情况;2. shared_ptr适用于共享资源的场景,通过引用计数自动管理生命周期,多个对象可安全访问同一资源;3. 推荐使用make_shared和make_unique创建智能指针,提升异常安全、内存效率和代码可读性;4. 实际开发中避免混用裸指针与智能指针,防止double free或悬空指针问题,慎用reset和release,避免循环引用导致内存泄漏。正确使用智能指针能有效避免内存问题,并促使开发者更清晰地管理资源归属。

C++智能指针怎么使用 unique_ptr shared_ptr实践指南

C++智能指针的使用其实并不难,关键是要理解它们各自的适用场景。unique_ptrshared_ptr 是最常用的两种,分别适用于独占所有权和共享所有权的情况。用对了能避免内存泄漏,用错了反而容易出问题。

C++智能指针怎么使用 unique_ptr shared_ptr实践指南

什么时候用 unique_ptr?

unique_ptr 表示唯一拥有权,也就是说这个指针只能被一个对象持有,不能复制,但可以移动(move)。非常适合用来管理生命周期明确、不需要共享的对象。

C++智能指针怎么使用 unique_ptr shared_ptr实践指南

比如你写一个函数,里面 new 了一个对象,希望函数返回后自动释放,就可以用 unique_ptr

立即学习C++免费学习笔记(深入)”;

std::unique_ptr<MyClass> createObject() {
    return std::make_unique<MyClass>();
}
登录后复制

它的好处是轻量、高效,而且强制你去思考资源的所有权问题,避免随意拷贝带来的隐患。

C++智能指针怎么使用 unique_ptr shared_ptr实践指南

使用建议:

  • 不需要共享资源时优先使用
  • 想要禁止拷贝语义的时候
  • 配合 STL 容器存储指针时很安全

shared_ptr 适合哪些情况?

shared_ptr 的特点是引用计数,多个指针可以指向同一个对象,只有当最后一个指针销毁或重置时才会释放资源。适用于多个地方都需要访问同一个对象的情况。

举个例子,如果你在多个类之间传递一个资源,比如一个配置对象或者网络连接句柄,用 shared_ptr 就很合适:

Picsart AI Image Generator
Picsart AI Image Generator

Picsart推出的AI图片生成器

Picsart AI Image Generator 37
查看详情 Picsart AI Image Generator
auto config = std::make_shared<Config>("config.json");
obj1.setConfig(config);
obj2.setConfig(config);
登录后复制

这时候不用担心谁先释放的问题,只要还有引用存在,就不会出错。

使用建议:

  • 多个对象共享一个资源时
  • 不确定哪个部分会最后使用资源
  • 注意循环引用问题(可以用 weak_ptr 破坏循环)

如何选择 make_shared 和 make_unique?

从 C++14 开始,推荐使用 std::make_sharedstd::make_unique 来创建智能指针。相比直接 new,这种方式更安全也更高效。

为什么

  • 异常安全:避免因为构造参数顺序导致的异常问题
  • 内存效率:make_shared 会一次性分配控制块和对象内存
  • 可读性更好,代码更简洁

例如:

auto ptr1 = std::make_shared<MyClass>(arg1, arg2);
auto ptr2 = std::make_unique<MyClass>(arg1);
登录后复制

不建议这样写:

std::shared_ptr<MyClass> ptr(new MyClass()); // 虽然也能用,但不够好
登录后复制

实际开发中需要注意的地方

有些细节如果不注意,很容易踩坑:

  • 不要混用裸指针和智能指针:比如把 new 出来的指针交给 shared_ptr,然后再手动 delete,就可能导致 double free。
  • 尽量避免从 this 构造 shared_ptr:否则可能会有悬空指针的风险,应该继承 enable_shared_from_this
  • 慎用 reset 和 release:尤其是 release,会放弃所有权而不释放资源,容易忘记处理。
  • 不要把同一个裸指针交给多个智能指针管理:后果就是不可预测的崩溃。

基本上就这些。用得多了你会发现,智能指针不是让你“不用管内存”,而是逼你更清晰地思考资源归属。

以上就是C++智能指针怎么使用 unique_ptr shared_ptr实践指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号