一、shared_ptr
main.cpp
#include <iostream>
using namespace std;
int main()
{
shared_ptr<int> myp(new int(100));
shared_ptr<int> myp1(myp);
myp = nullptr;//效果同reset一样
//myp.reset();
myp1.reset();//置空智能指针,并做减1操作,如果减为0,则删除对象
shared_ptr<int> myp2(new int(100));
myp2.reset(new int(200));//原来指向的100对象释放,重新指向200对象
int *p = myp2.get();//或者int*指针
cout << *myp2 << endl;//解引用
if (myp2)
{
cout << "目前指向对象" << endl;
}
auto p1 = make_shared<int>(100);
auto p2 = make_shared<int>(200);
p1 = p2;//p1原来指向的100对象析构,p1和p2同时指向200对象,strong为2
int icount = p1.use_count();
if (p1.unique())
{
cout << "只有一个智能指针指向对象" << endl;
}
shared_ptr<int[]> pint(new int[10]);//数组类智能指针定义
}
一个对象可以被多个shared_ptr引用,shared_ptr为强指针,其引用计数为0时,所指向的对象释放。
二、week_ptr
main.cpp
#include <iostream>
using namespace std;
int main()
{
auto p3 = make_shared<int>(100);//strong 1
weak_ptr<int> p4(p3);//strong 1 week 1
//p3.reset();
auto p5 = p4.lock();//如果调用了p3.reset(),强指针引用计数为0,对象被析构,lock后p5为nullptr;如果对象还在增加强指针引用计数,strong 2 week 1,返回p5为强指针
if (p5)
{
cout << "对象并未销毁" << endl;
}
else
{
cout << "对象已销毁" << endl;
}
cout << p5.use_count() << endl;//返回弱指针共享对象的其他share_ptr的数量
if (p4.expired())
{
cout << "弱指针指向的对象已销毁" << endl;
}
p4.reset();//弱指针引用计数减1
}
week_ptr不影响引用计数。
三、unique_ptr
#include <iostream>
using namespace std;
int main()
{
auto p6 = make_unique<int>(100);
unique_ptr<int> p7(new int(200));
//unique_ptr<int> p8(p7);错误,unique_ptr不支持拷贝
//unique_ptr<int> p8 = p7;错误,unique_ptr不支持赋值运算符
unique_ptr<string> p9(new string("I love china"));
unique_ptr<string> p10 = std::move(p9);//调用的是移动构造函数,移动完后p9为空,p10指向原来p9所指
if (p9)//fasle
{
cout << "p9指向对象" << endl;
}
if (p10)//true
{
cout << "p10指向对象" << endl;
}
unique_ptr<string> p11(new string("I love china"));
unique_ptr<string> p12(p11.release());//返回裸指针,将该p11智能指针置空
unique_ptr<string> p13(new string("I love china"));
unique_ptr<string> p14(new string("I love china2"));
p13.reset(p14.release());//reset会释放p13指向对象内存,重新指向p14指向的对象,p14指针置空
unique_ptr<string> p15(new string("I love china"));
p15 = nullptr;//等价于p15.reset()
unique_ptr<string> p16(new string("I love china"));
*p16 = "I love china1";
//unique_ptr<string> p17(p16.get());//错误,会让p16和p17都指向I love china
//shared_ptr包含一个显示构造函数,用于将unique_ptr右值转换为shared_ptr,shared_ptr接管原来的unique_ptr
unique_ptr<string> p18(new string("I love china"));
shared_ptr<string> p19 = std::move(p18);//p18为空,p19接管对象,strong为1
}
一个对象只能被一个unique_ptr引用,除非如上所示std::move,release。