C++11 智能指针 unique_ptr shared_ptr weak_ptr

智能指针

智能指针是基于RAII机制实现的类(模板),具有指针的行为(重载了operator*与operator->操作符),可以“智能”地销毁其所指对象。C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针,可以对动态资源进行管理智能指针是类而不是指针 

c++11将boost库智能指针纳入标准


unique_ptr

unique_ptr 替代了原来的auto_ptr,指向对象具有唯一性,即同一时间只能有unique_ptr指向给定对象(和auto_ptr不同是禁止拷贝语义,通过移动语义替代)
unique_ptr对象生命周期与其作用域范围保持一致,从创建直至其离开作用域

unique_ptr 指针和其所绑定对象关系:在智能指针生命周期内,可以改变其绑定对象,可以通过reset()重新指定,可以通过release方法释放其所有权,通过移动语义来转移其所有权

<span style="white-space:pre">	</span>std::unique_ptr<int> u_i;//创建空智能指针
	u_i.reset(new int(1));//绑定动态对象
	
	unique_ptr<int> u_i2(new int(2));
	int *p_i = u_i2.release();//释放所有权  这时候需要手动释放动态分配的内存
	delete p_i; p_i = nullptr;

	unique_ptr<string> u_s(new string("1213"));//创建时绑定
	//unique_ptr<string> u_s1 = u_s;//编译错误,赋值函数是私有,不能通过赋值函数转移所有权
	unique_ptr<string> u_s2 = std::move(u_s);//通过move语义转移所有权

	u_s2 = nullptr;

	vector<unique_ptr<int>> vi;//可作为容器元素
	vi.push_back(std::move(unique_ptr<int>(new int(1))));  

	unique_ptr <int[]> vi_array( new int[3]{1, 2, 3});//可以以动态数组为基本类型  销毁对象调用delete[]
	vi_array[0] = 2;//重载了[]

	//自定义资源删除操作
	//uinque_ptr 默认的释放资源操作是delete/delete[] 
	unique_ptr<COM, decltype(SafeReleaseCOM)*> u_com(new COM(), SafeReleaseCOM);


shared_ptr

shared_ptr是一种引用计数指针,没有任何其它的shared_ptr指向原本指向对象时,才会销毁对象
shared_ptr与weak_ptr智能指针均是C++ RAII的一种应用,可用于动态资源管理
shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁时,会自动销毁其所指对象(通过delete操作符)。
shared_ptr的默认能力是管理动态内存,但支持自定义的Deleter以实现个性化的资源释放动作。
weak_ptr用于解决“引用计数”模型循环依赖问题,weak_ptr指向一个对象,并不增减该对象的引用计数器
shared_ptr的创建、拷贝、绑定对象的变更(reset)、shared_ptr的销毁(手动赋值为nullptr或离开作用域)、指定deleter等操作 与uique_ptr不同的是shared_ptr赋值拷贝可以使用,此时引用计数加一

weak_ptr

weak_ptr用于配合shared_ptr使用,并不影响动态对象的生命周期,即其存在与否并不影响对象的引用计数器。
weak_ptr并没有重载operator->和operator *操作符,因此不可直接通过weak_ptr使用对象。
提供了expired()与lock()成员函数,前者用于判断weak_ptr指向的对象是否已被销毁,后者返回其所指对象的shared_ptr智能指针(对象销毁时返回”空“shared_ptr)。
循环引用的场景:如二叉树中父节点与子节点的循环引用,容器与元素之间的循环引用等

shared_ptr使用场景

对象之间“共享数据”,对象创建与销毁“分离”
放入容器中的动态对象,使用shared_ptr包装,比unique_ptr更合适
管理“动态数组”时,需要制定Deleter以使用delete[]操作符销毁内存,因为shared_ptr并没有针对数组的特化版本(unique_ptr有针对数组的特化版本)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值