从 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.
是否可以从 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.