引用计数的增加:
新的shared_ptr指向同一块内存
作为函数参数 值传递的时候
作为函数的返回值,被接收的时候
引用计数的减少:
给shared_ptr赋予新值,使其指向新的内存
局部shared_ptr离开其作用域
usecount():返回引用计数的值
unique():若此指针独占这个内存区域,则返回true,否则false,若指针指向空也返回false
reset():(无参数)若指针是唯一指向内存区域的指针,则释放此内存,并将指针置空,若不是唯一的,则将引用计数减一,并将此指针置空
(有参数)其余都和上述一样,只是指针不再置空,而是指向括号内new出来的指针
get():返回裸指针
swap():交换两个指针指的对象
shared_ptr<int> p1 = new int(100);
shared_ptr<int> p2 = new int(20);
std::swap(p1,p2);
p1.swap(p2);
如果shared_ptr指向了一个有自定义析构函数的类对象数组,则需要设置自定义的删除器,因为智能指针销毁操作都是默认的不带中括号的delete,所以此时无法析构所有的对象。
class A
{
public:
A(){}
~A(){}
};
shared_ptr<A> p(new A[10],[](A *p){delete []p;});
或者使用default_delete<>()
class A
{
public:
A(){}
~A(){}
};
shared_ptr<A> p(new A[10],default_delete<A[]>());
内存区域和删除器是绑定的,假如两个shared_ptr 分别拥有两个不同的删除器,其中一个指向另一个后,若另一个的内存区域被释放,则调用的删除器不变。
auto lambda1 = [](int *p)
{
cout << "lambda1" << endl;
delete p;
};
auto lambda2 = [](int *p)
{
cout << "lambda2" << endl;
delete p;
};
shared_ptr<int> p1(new int(100),lambda1);
shared_ptr<int> p2(new int(200),lambda2);
p2 = p1;
p1.reset();
输出为: