c++智能指针unqiue_ptr

基本分类

在C++中智能指针有四种,分别是auto_ptr,shared_ptr,unique_ptr,weak_ptr。其中auto_ptr已经被舍弃,不在累述。大约可以分为两类:

  • 一种是独占式拥有,即同一时间内只有一个智能指针可以指向该对象。但是你可以移交拥有权,它对于避免资源泄露,例如“以new创建对象后因为异常发生而忘记调用delete,特别有用”。
  • 二是共享式拥有,多个智能指针可以指向相同对象,该对象会在最后一个reference被销毁时,被释放,即计数器为0时。问了能在结构较复杂的情境下工作,标准库提供了weak-普通人,bad_weak_ptr,enable_shared_from_this等辅助类。

头文件
所有智能指针的头文件都是

unique_ptr

unique_ptr 是为了保证在异常情况下析构函数被成功调用。字面上的意思就是unique_ptr是“其所指对象”的唯一拥有者。使用unique_ptr的充要条件就是他所指的对象只有一个拥有着。

 #include <string>
#include <iostream>
#include <memory>
#include <cassert>
using namespace std;
class Object
{
public:
	Object(int a):m_a(a)
	{
		cout << "构造函数被调用" << endl;
	}
	~Object()
	{
		cout << "析构函数被调用" << endl;
	}
	Object(const Object&& rhs)
	{
		cout << "移动构造函数被调用" << endl;
	}
	void say()
	{
		cout << "say" << m_a << endl;
	}
	int m_a;
};
typedef std::unique_ptr<Object> UniqueObjectPtr;
void print(const UniqueObjectPtr& rhs) { cout << "print" << endl; }
void transfer(UniqueObjectPtr obj) {
	//一旦调用该函数,如果该函数不在转移拥有权,对象会在函数结束时delete调
	cout << "transfer" << obj->m_a << endl; 
	}
UniqueObjectPtr source(UniqueObjectPtr obj)
{
	cout << "source" << endl;
	return obj; // 不在需要调用std::move,此处已将权限返回,是因为语言的规定
}
int main()
{
	//UniqueObjectPtr up = new Object; 无法编译成功,因为必须直接初始化
	UniqueObjectPtr up(new Object(5));//直接初始化
	/*auto p = up.get(); //返回被存储的point的地址
	if (nullptr == p)
	{
		return -1;
	}*/
	if (up)
	{
		cout << "智能指针存在" << endl;
	}
	//print(up);
	up->say();
	//UniqueObjectPtr up1 = up; //同时只能有一个拥有该对象
	UniqueObjectPtr up1(std::move(up));//使用std::move移交对象的所有权
	up1->say();

	//transfer(up1);//同时只能有一个拥有该对象,无法编译成功,有临时对象obj
	//transfer(std::move(up1));//需要将管理权移交给临时对象obj,up1会被置NULL
	//cout << up1->m_a << endl; 在std::move(up1)移交之后,在此调用时,会导致程序崩溃
	//assert(NULL == up1);
	UniqueObjectPtr up2(std::move(source(std::move(up1))));
	std::shared_ptr<Object> sh(std::move(up2)); //将控制权移交给shaed_ptr管理,up1会被置NULl
	assert(NULL == up1);
};

当定义一个array数组时,或者需要定义自定义删除,如需要关闭文件描述符或者关闭句柄时,需要重写自己的Deleter,可以借用lambda,模式如下std::unique_ptr<T,void()(T)>;

#include <string>
#include <iostream>
#include <memory>
using namespace std;


int main()
{
	//模板为std::unique_ptr<T,void(*)(T*)>;
	std::unique_ptr<int, void(*)(int*)> up(new int[10], 
						[](int*p){cout << "析构函数被调用 "<< endl;
						delete[] p; });
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值