文章来源于C++Primer的读后笔记
众所周知,智能指针是模版,因此应在<>里面给出类型,则创建shared语句为:
shared_ptr<string> p1;
- 默认初始化为空
- 使用方式和普通指针一样(解引用、引用)
支持功能代码实例:
1.p
int main()
{
shared_ptr<string> p;//默认初始化为空
if(!p)
cout << "[(p):当将p作为条件判断时候,若p指向其他对象,则返回true,若为空,返回false]" << endl;
return 0;
}
2.make_shared(param)、*p
int main()
{
shared_ptr<string> p = make_shared<string>("make_shared<T>(param)返回一个shared_ptr,指向动态分配的T类型内存,使用param初始化\n*p为对shared内存的解引用");
cout << *p <<endl;
return 0;
}
make_shared<T>(count,param)
make_shared<T>()
eg:
make_shared<string>(10,"s"); //ssssssssss
make_shared<int>(); //0
3.swap(p,q)、p.swap(q)
交换两个shared_ptr所指向的对象(不仅适用于shared_ptr)
int main()
{
shared_ptr<string> p1 = make_shared<string>("I am p1");
shared_ptr<string> p2 = make_shared<string>("I am p2");
cout << "交换之前:" << endl;
print(p1, p2);
cout << "第1次交换之后:" << endl;
swap(p1, p2);
print(p1, p2);
cout << "第2次交换之后:" << endl;
p1.swap(p2);
print(p1, p2);
return 0;
}
4.p.use_count
返回p共享对象的智能指针数量
int main()
{
shared_ptr<string> p1 = make_shared<string>("I am p1");
cout << "p1:引用次数:" << p1.use_count() << endl;
shared_ptr<string> p2(p1);
cout << "p1:引用次数:" << p1.use_count() << endl;
return 0;
}
注意:p2中同样记录引用次数的,并且于p1数量一致。引用次数为0时,自动释放内存。
5.shared_ptrp(q)
拷贝,下面代码主要验证是否增加拷贝次数
int main()
{
shared_ptr<string> p1 = make_shared<string>("I am p1");
cout << "p1:引用次数:" << p1.use_count() << endl;
shared_ptr<string> p2 = shared_ptr<string>(p1);
cout << "p1:引用次数:" << p1.use_count() << endl;
shared_ptr<string> p3 = shared_ptr<string>(p1);
cout << "p1:引用次数:" << p1.use_count() << endl;
return 0;
}
6.自动销毁所管理的对象
use_count 为0时,调用析构函数完成对象的销毁(为了方便掩饰,自定义A类)
class A
{
int a;
public:
A()
{
a = 10;
}
~A()
{
cout << "~A:" << "调用了我" << endl;
}
};
int main()
{
shared_ptr<A> a = make_shared<A>();
return 0;
}
从上述代码中也可以看到 对象a离开作用域自定释放
(此处理解不够,有错请大佬指出)