从 unique_ptr 移动到堆栈变量

move from unique_ptr to stack variable

是否可以从 std::unique_ptr<T> 创建堆栈变量(T 类型,带有移动构造函数)?

我试过

std::unique_ptr<T> p = ext_get_my_pointer();   // external call returns a smart pointer
T val{std::move(*p.release())};                // I actually need a stack variable

但它看起来很丑,而且显然会造成内存泄漏。不知道为什么。

是的,它会造成内存泄漏,因为 p.release() 你说你对该对象负责,因此你需要 delete 它。

你会这样做:

std::unique_ptr<T> p = ext_get_my_pointer();   // external call returns a smart pointer
T val{std::move(*p)};
p.reset(nullptr);

这是内存泄漏,因为您已将分配的内存与 unique_ptr 分离,但它仍然是分配的。 假设你有一个正常运行的移动构造函数,为什么不呢:

std::unique_ptr<T> p = ext_get_my_pointer(); 
T val{std::move(*p)};
// p goes out of scope so is freed at the end of the block, or you can call `p.reset()` explicitly.