第三节 · 瓶子工厂 · 动态数组

手动管理内存容易出错。C++11 引入了智能指针,它们在不再需要时自动释放内存,大大降低了内存泄漏的风险。


unique_ptr - 独占所有权

unique_ptr 独占它所指向的对象,不能复制,只能移动。

#include <memory>
using namespace std;

int main()
{
    // 创建 unique_ptr
    unique_ptr<int> p1(new int(42));
    
    // C++14 推荐方式
    auto p2 = make_unique<int>(42);
    
    cout << *p2 << endl;  // 42
    
    // unique_ptr<int> p3 = p2;  // 错误!不能复制
    unique_ptr<int> p3 = move(p2);  // 可以移动
    
    // 此时 p2 为空
    if (!p2) cout << "p2 is null" << endl;
    
    return 0;
}  // p1, p3 自动释放

unique_ptr 与数组


shared_ptr - 共享所有权

shared_ptr 允许多个指针指向同一对象,使用引用计数管理生命周期。


weak_ptr - 弱引用

weak_ptr 不增加引用计数,用于解决循环引用问题。


选择指南

场景
选择

独占所有权

unique_ptr

共享所有权

shared_ptr

打破循环引用

weak_ptr

性能敏感

优先 unique_ptr


智能指针与函数


智能指针与工厂模式


自定义删除器


常见陷阱


习题

  • 解释 unique_ptrshared_ptr 的区别和使用场景。

  • 什么是循环引用?如何解决?

  • 实现一个使用智能指针的链表。

Last updated