shared_ptr的UML图
注意:这是Linux上GCC 8.5.0的实现版本
先看下它的继承关系。
shared_ptr里面的数据成员
有了上面的UML图,可能还没有一个直观的认识,下面我们把这些成员打印出来。
当然得先写个小小的程序:
$ cat shared_ptr.cpp
#include <memory>
#include <iostream>
int main(){
int* ip = new int(100);
std::shared_ptr<int> is1(ip);
std::shared_ptr<int> is2(is1);
std::cout<<"use count:"<<is2.use_count()<<std::endl;
return 0;
}
is1构造完后,看下它的值:
is1有两个成员变量:
- _M_ptr: 为真正的指针的值,本例中即整形的地址。
- _M_refcount: 为__shared_count类型,仅包含一个指针,这个指针指向new出来的另外一个对象它包含两个整形成员(_M_use_count, _M_weak_count)
从内存角度看图是这样的:
小知识点:private是限制编译的,GDB是能访问它修饰的成员变量的。
shared_ptr的构造
相信看完上面的各种图和数据,大家应该能想想出来构造的过程。
这次我们step into第六行
shared_ptr的构造函数调用了基类__shared_ptr的构造函数
之后new了一个_Sp_counted_ptr,我就不一步步走下去了。