看了很多对于 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
的。