C++unique_ptr小结

返回unique_ptr

unique_ptr<string> test()
{
	return unique_ptr<string>(new string("hello world"));
	// 我们知道在unique_ptr不能进行赋值, 或者使用其他的指针初始化, 
	// 在这里创建了临时的对象, 所以会调用移动构造函数,可以实现赋值
}

unique_ptr<string> pstr = test();
cout << *pstr << endl;

指定删除器

指定删除器的格式

// unique_ptr<指定的对象类型, 删除器> 智能指针变量名
void mydelete(string* str)
{
	delete str;
	str = nullptr;
	cout << "delete ok" << endl;
}
	typedef void(*pf)(string*); // 定义一个函数指针类型, 类型名字叫fp
	// or using pf = void(*)(string*);
	// typedef decltype(mydelete)* pf;
	unique_ptr<string, pf> pstr_1(new string("C++ hello"), mydelete);

	auto mydella = [](string* pstr)
	{
		delete pstr;
		pstr = nullptr;
		cout << "delete ok" << endl;
	};
	unique_ptr < string, decltype(mydella)> pstr_1(new string("C++ hello"), mydella);

尺寸问题

通常情况下, unique_ptr的大小和裸指针的大小一样, 但是当指定了删除器之后, unique_ptr的指针的大小会随之而改变,

	auto mydella = [](string* pstr)
	{
		delete pstr;
		pstr = nullptr;
		cout << "delete ok" << endl;
	};
	unique_ptr < string, decltype(mydella)> pstr_1(new string("C++ hello"), mydella);
	cout << sizeof(pstr_1) << endl; // 8字节

所以对于unique_ptr来说, 指定了删除器可能会导致效率下降

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值