对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 

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 ui = std::make_unique(std::string{"Tom"}, 43);

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

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


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

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

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

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

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

你可能感兴趣的:(大猫学C/C++,c++)