智能指针
必备知识:
-
├── 1. 基本概念
-
│ ├── 作用:管理动态内存,防止内存泄漏
-
│ ├── RAII(Resource Acquisition Is Initialization)
-
│ ├── 避免手动
new/delete
-
│ ├── C++11 引入
std::unique_ptr
和std::shared_ptr
-
│ ├── C++14 引入
std::make_unique
-
│ ├── C++17 引入
std::shared_ptr
的std::make_shared
-
├── 2. std::unique_ptr(独占指针)
-
│ ├── 只能有一个所有者
-
│ ├── 不可复制(拷贝构造和拷贝赋值删除)
-
│ ├── 可移动(支持
std::move
) -
│ ├── 用法:
-
│ │ ├──
std::unique_ptr<T> p(new T(...));
-
│ │ ├──
auto p = std::make_unique<T>(...);
-
│ ├── 释放方式:超出作用域自动释放
-
├── 3. std::shared_ptr(共享指针)
-
│ ├── 允许多个
shared_ptr
共享同一对象 -
│ ├── 采用 引用计数 机制(use_count)
-
│ ├──
std::make_shared<T>
(推荐,减少额外开销) -
│ ├── 释放方式:引用计数为 0 时自动释放
-
│ ├── 循环引用问题:
-
│ │ ├── 解决方案:使用
std::weak_ptr
-
├── 4. std::weak_ptr(弱指针)
-
│ ├── 解决
std::shared_ptr
循环引用问题 -
│ ├── 不能直接访问对象,需
lock()
转换为std::shared_ptr
-
│ ├──
expired()
判断对象是否已释放 -
├── 5. std::auto_ptr(C++98,已废弃)
-
│ ├── C++11 已废弃,C++17 移除
-
│ ├── 拷贝后原指针变空,容易引发问题
-
├── 6. 自定义删除器
-
│ ├── 适用于
s