- 智能指针
- 1. shared_ptr
- 2. unique_ptr
- 3. werk_ptr
(1) shared_ptr 的实现机制是在拷贝构造时,使用同一份引用计数
-
一个模板指针 T* ptr: 指向实际对象
-
一个引用次数: 必须new 出来,不然会多个shared_ptr 里面会有不同的引用次数而导致多次delete
-
重载 operator* 和 operator->: 使得其能像指针一样使用shared_ptr
-
重载 copy constructor: 使其引用次数 + 1
-
重载 operator = (默认运算符)
如果原来的shared_ptr 已经有对象,则让其引用次数减一,并判断引用是否为0(是否调用delete),然后将新的对象引用次数加一
-
重载析构函数: 使引用次数减一,并判断引用是否为0 (是否调用delete)
(2) 线程安全问题
- 同一个shared_ptr被多个线程 “”读“ 是安全的
- 同一个shared_ptr 被多个线程 “写” 是不安全的
- 共享引用计数的不同的shared_ptr被多个线程 “写” 是安全的
(1)unique_ptr “唯一”拥有其所指向对象
同一时刻只能由一个unique_ptr 指向所给定对象,离开作用域时,若其指向对象,则将其所指向对象销毁(默认delete)
(2)定义unique_ptr 时
需要将其绑定到一个new返回的指针上
(3)unique_ptr 不支持普通的拷贝和赋值(因为拥有指向的对象)
但是可以拷贝和赋值一个将要被销毁的unique_ptr; 可以通过release 或者 reset 将指针所有权从一个非 const 的unique_ptr 转移到另一个unique
3. werk_ptr1. weak_ptr 是为了配合 shared_ptr 而引入的一种智能指针
它的最大作用在于 协助shared_ptr工作,像旁观者那样观测资源的使用情况,但weak_ptr 没有共享资源,它的构造不会引起指针引用计数的增加
2. 和shared_ptr 指向相同内存
shared_ptr 析构之后内存释放,在使用之前,使用lock()检查 weak_ptr 是否为空指针



