https://www.nowcoder.com/discuss/418992
- 智能指针的实现,weak_ptr为什么能解决循环引用的问题
<<C++ Primer>>第五版

动态内存管理通过 new 和 delete 来完成(但是容易出现问题)
智能指针
- shared_ptr:多指针指向同一个对象
- unique_ptr: "独占"所指向的对象
- weak_ptr:则指向shared_prt所管理的对象.(是伴生类(书上为伴随类),是一种弱引用)
这三种类型都定义在memory头文件中
shared_ptr类
智能指针也是模板
模板
- 类模板
- 函数模板
以vector为例,vector是一个类模板,vector<int> 为vector模板的实例化.生成的是vector<int> 类型.

shared_ptr<string> p1;
一般的定义方法:
shared_ptr<int> p = make_shared<int>(42);
通常用
auto p2 = make_shared<vector<string>>();
shared_ptr原理
https://blog.csdn.net/lizhentao0707/article/details/81156384
shared_ptr是一个模板类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源.
采用引用计数器的方法,允许多个智能指针指向同一个对象,每当多一个指针指向该对象时,指向该对象的所有智能指针内部的引用计数加1,每当减少一个智能指针指向对象时,引用计数会减1,当计数为0的时候会自动的释放动态分配的资源。
计数器递增
- 拷贝
- 作为参数传递给一个函数
- 作为函数的返回值
计数器递减
- 被赋予新值
- 被销毁(局部的shared_ptr离开作用域)
unique_ptr
unique_ptr采用的是独享所有权语义,一个非空的unique_ptr总是拥有它所指向的资源。转移一个unique_ptr将会把所有权全部从源指针转移给目标指针,源指针被置空.
unique_ptr不支持普通的拷贝和赋值操作,不能用在STL标准容器中
weak_ptr
int *pi = new int;
此new表达式在自由空间构造一个int型对象,并返回指向该对象的指针.
弱引用。 引用计数有一个问题就是互相引用形成环(环形引用),这样两个指针指向的内存都无法释放。需要使用weak_ptr打破环形引用。weak_ptr是一个弱引用,它是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是说,它只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前使用函数lock()检查weak_ptr是否为空指针。

网友评论