对std::unique_ptr 的误解

看了很多对于 std::unique_ptr的介绍,让我对其产生一种误解,让我以为它不能被二次赋值

unique_ptr 不共享它的指针。 它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何 C++ 标准库算法。 只能移动 unique_ptr。 这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。 我们建议你将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。 因此,当需要智能指针用于纯 C++ 对象时,可使用 unique_ptr,而当构造 unique_ptr 时,可使用 make_unique Helper 函数。

FROM: 如何:创建和使用 unique_ptr 实例

比如上面这段介绍,还有各种其他的,让我以为其只能被 std::move 的方式进行处理,否则不能处理了。

然后我自己写了如下的实例代码:

#include <memory>

struct DataU
{
	std::string name;
	int number;
	DataU(std::string name, int num)
		:name(name)
		, number(num)
	{}


};

int main()
{
	std::cout << "Hello CMake." << std::endl;
	
	std::unique_ptr<DataU> ui = std::make_unique<DataU>(std::string{"Tom"}, 43);

	std::unique_ptr<DataU> ui2 = ui;           // 实际上是这里报错了
	ui = std::make_unique<DataU>(std::string{ "Tom"}, 97); // 我以为这里会报错

	std::cout << "name: " << ui->name << std::endl;


	std::shared_ptr<DataU> si = std::make_shared<DataU>(std::string{"Stone"}, 12);
	std::shared_ptr<DataU> si2 = si;
	si = std::make_shared<DataU>(std::string{ "Ann" }, 38);
	std::cout << "name: " << si->name << std::endl;

	std::cout << "Hello CMake 2." << std::endl;
	return 0;
}

不过出于性能考虑,防止内存泄漏,在二次赋值之前应该去释放之前的指针。

	std::unique_ptr<DataU> ui = std::make_unique<DataU>(std::string{"Tom"}, 43);
	ui.reset();
	ui = std::make_unique<DataU>(std::string{ "Tom"}, 97);

当然,在上面这个 main里面,是可以不去 reset 的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值