C++ 智能指针详解:从原理到实践

简介: 深入解析 C++ 智能指针的原理与用法,掌握 unique_ptr、shared_ptr、weak_ptr 的最佳实践

C++ 智能指针详解:从原理到实践

在现代 C++ 开发中,智能指针是内存管理的核心工具,它们帮助我们避免内存泄漏和悬空指针问题。

为什么需要智能指针?

传统的裸指针存在诸多问题:

void problematic() {
   
    int* ptr = new int(42);
    // 如果这里抛出异常,内存泄漏!
    doSomething();
    delete ptr;  // 可能永远执行不到
}

三种智能指针

unique_ptr:独占所有权

unique_ptr 确保同一时间只有一个指针拥有资源:

#include <memory>

auto ptr = std::make_unique<int>(42);
// std::unique_ptr<int> ptr2 = ptr;  // 编译错误!
std::unique_ptr<int> ptr2 = std::move(ptr);  // 转移所有权

使用场景:工厂函数返回值、类成员独占资源

shared_ptr:共享所有权

多个指针可共享同一资源,引用计数归零时自动释放:

auto sp1 = std::make_shared<std::string>("Hello");
auto sp2 = sp1;  // 引用计数 = 2

std::cout << sp1.use_count() << std::endl;  // 输出: 2

注意:避免循环引用!

weak_ptr:打破循环引用

weak_ptrshared_ptr 的观察者,不增加引用计数:

class Node {
   
public:
    std::shared_ptr<Node> next;
    std::weak_ptr<Node> prev;  // 使用 weak_ptr 避免循环引用
};

性能对比

特性 unique_ptr shared_ptr weak_ptr
开销 零开销 引用计数 引用计数
拷贝 不可拷贝 可拷贝 可拷贝
线程安全 计数安全 计数安全

最佳实践

  1. 优先使用 make_unique/make_shared

    // 推荐
    auto ptr = std::make_unique<Widget>();
    // 不推荐
    std::unique_ptr<Widget> ptr(new Widget());
    
  2. 函数参数传递

    void process(Widget* w);           // 不转移所有权
    void consume(std::unique_ptr<Widget> w);  // 转移所有权
    

总结

智能指针是现代 C++ 的基石。合理选择 unique_ptrshared_ptrweak_ptr,能让代码更安全、更易维护。

相关文章
|
2月前
|
存储 安全 定位技术
交友APP开发搭建/社交软件同城交友推荐匹配
打造社交APP最小可行产品(MVP):支持手机号/微信登录,完善个人资料与兴趣标签。核心匹配采用滑动交友、问卷配对及兴趣群组模式,双向匹配后可聊天。集成腾讯云IM、地图、云存储、短信验证等第三方服务,快速部署上线。通过冷启动运营获取种子用户,结合活动与数据驱动持续迭代优化。
520 1
交友APP开发搭建/社交软件同城交友推荐匹配
|
存储 编译器 测试技术
交叉编译spdlpg 参数详解
交叉编译spdlpg 参数详解
686 0
|
关系型数据库 MySQL 数据库
MySQL数据库期末项目 图书馆管理系统(上)
MySQL数据库期末项目 图书馆管理系统
884 0
|
3月前
|
算法 Java 开发者
Java 中 HashMap 的底层实现原理详解
深入分析 Java HashMap 的底层实现原理,包括数据结构、hash 算法和扩容机制
Java 中 HashMap 的底层实现原理详解
|
8月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
存储
strcpy、sprintf 与 memcpy 的区别
在 C 语言中,`strcpy`、`sprintf` 和 `memcpy` 是三个用于处理内存和字符串的函数,它们有不同的用途和特点
|
人工智能 安全 小程序
搬运5款体积小但非常实用的小工具
本文推荐了几款小巧且功能全面的软件,包括文件同步工具SyncToy、局域网文件传输软件Feem、在线AI工具箱3171.cn、安全文件共享工具OnionShare以及三维建模软件Blender,旨在满足用户在不同场景下的需求,提升效率的同时减少系统负担。
372 0
|
C++ 安全 存储
C++智能指针解析
C++智能指针解析
291 0
C++智能指针解析
|
存储 缓存 算法
深入了解Memcached:缓存技术的利器
Memcached是一个开源的高性能分布式内存缓存系统,用于加速动态Web应用。它通过将数据库查询结果、API调用结果或其他数据缓存到内存中,减少对数据库的访问频率,从而提高应用的响应速度。本文详细介绍了Memcached的基本原理、架构、安装配置、使用方法、测试方法以及应用场景。通过Memcached,开发者可以有效提升Web应用的性能,减少数据库负载,改善用户体验。
603 5