C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++智能指针unique_ptr / shared_ptr / weak_ptr

C++11智能指针核心体系详解 (unique_ptr / shared_ptr / weak_ptr)

作者:handler01

这段文章详细探讨了C++中裸指针的痛点及RAII思想,重点介绍了智能指针(如unique_ptr、shared_ptr)的概念与使用,强调了它们在资源管理上的的优势,如独占所有权、共享引用计数、避免异常安全问题等

一、裸指针的痛点与 RAII 思想

1.1 裸指针与异常安全隐患

void Func() {
    int* array1 = new int[10];
    int* array2 = new int[10]; // 若此处抛异常,array1 将永远无法释放
    try {
        // ... 可能抛出异常的业务逻辑 ...
    } catch(...) {
        // 发生异常时,必须手动清理已分配的所有内存,再重新抛出
        delete[] array1;
        delete[] array2;
        throw; 
    }
    delete[] array1;
    delete[] array2;
}

1.2 RAII 设计理念与智能指针模拟

1.3 历史遗留的坑点:auto_ptr(C++98)

二、 现代 C++ 核心智能指针体系 (C++11/14)

2.1 独占型智能指针:unique_ptr

template< class T, class... Args >
std::unique_ptr<T> make_unique( Args&&... args );

功能说明:完美转发参数给 T 的构造函数并在堆上创建对象,返回管理该对象的 unique_ptr

2.2 共享型智能指针:shared_ptr

template< class T, class... Args >
std::shared_ptr<T> make_shared( Args&&... args );

功能说明:构造对象并返回 shared_ptr。强烈推荐替代 new 使用,可实现内存合并分配。

当计数器减到 0 时,说明当前是最后一个管理者,此时释放资源和计数器。

2.3 伴生弱指针:weak_ptr与循环引用陷阱

std::shared_ptr<T> lock() const noexcept;
bool expired() const noexcept;

2.4 横向对比与 Reactor 模型选型规则

特性unique_ptrshared_ptr
所有权独占 (Exclusive)共享 (Shared)
拷贝行为严格禁止允许(内部引用计数+1)
开销零(等同裸指针)存在(维护原子计数器)
适用场景唯一拥有者 (首选)必须在多处模块共享同一个对象

三、 为什么必须拥抱make_*系列?

3.1 消除极度隐蔽的“异常安全”漏洞

3.2 底层内存布局与性能优化 (make_shared专享)

3.3 架构师视角:必须退回使用new的特例

到此这篇关于C++11智能指针核心体系详解 (unique_ptr / shared_ptr / weak_ptr)的文章就介绍到这了,更多相关C++智能指针unique_ptr / shared_ptr / weak_ptr内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文