2020/11/03.shared_ptr,weak_ptr,unique_ptr简单实用

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之前的对象


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值