1.共享指针
shared_ptr<指向的类型> 指针名
/*std::shared_ptr<int> ptr1 = std::make_shared<int>(260);*/ //1.初始化的方式
std::shared_ptr<int> ptr1(new int(100));//2.初始化的的方式
std::weak_ptr<int> pw(ptr1); //弱指针
qDebug() << "ptr1:" << sizeof(ptr1);
qDebug() << "weak ptr:" << sizeof(pw);
int icount = ptr1.use_count(); //返回引用计数
qDebug() << icount;
std::shared_ptr<int> ptr2(ptr1);
qDebug() << ptr2.use_count();
std::shared_ptr<int> ptr3;
ptr3 = ptr2;
qDebug() << "ptr1" << ptr1.use_count() << "ptr3" << ptr3.use_count();
2.shared_ptr常用函数
1)reset 不带参数
std::shared_ptr<std::string> prs(new std::string("hello world"));
prs.reset(); //reset 不带参数释放prs指向的的对象,并且prs置空,引用计数减一
if (prs == nullptr)
{
std::cout << "prs is null ptr "<<std::endl;
}
reset带参数
std::shared_ptr<int> pi(new int(100));
pi.reset(new int(10));//释放原来的内存,指向新的内存
std::cout << *pi << std::endl;
2)get() 成员函数,返回p中保存的指针,慎用。
3)swap()成员函数
std::shared_ptr<std::string> ps1(new std::string("ptr 01"));
std::shared_ptr<std::string> ps2(new std::string("ptr 02"));
std::swap(ps1, ps2);
std::cout << "ps1:" << *ps1 << "ps2:" << *ps2 << std::endl; //交换两个智能指针所指向的对象
3.weak_ptr弱指针
将弱指针绑定到shared_ptr上并不会改变shared_ptr的引用计数。能够监视它所指向的对象是否存在了。
//弱指针的创建
std::shared_ptr<std::string> ps3(new std::string("ptr 01"));
std::weak_ptr<std::string> pw(ps3);
auto ps4 = pw.lock(); //lock判断所指向的强引用是否存在,不存在则返回空,如果存在返回强引用,引用计数会+1
use_count()//指向的强引用的引用计数
expired()//是否过期 use_count 为0
4.智能指针内存分布
5.独占式指针 unique_ptr
同一时刻只能有一个unique_ptr指针指向这个对象,当这个unique_ptr被销毁时,他所指向的对象也会被销毁。
std::unique_ptr<int> pi(new int(105));//创建
unique_ptr不允许复制,赋值等动作,只能移动。
std::unique_ptr<std::string> ps1(new std::string("hello world"));
std::unique_ptr<std::string> ps2 = std::move(ps1); //ps1 为空 ps2 指向 ps1之前的对象