unique_ptr::release() 是否调用析构函数?

问题描述 投票:0回答:6

这段代码正确吗?

auto v =  make_unique<int>(12);
v.release();     // is this possible?

它相当于原始指针的

delete
吗?

c++ unique-ptr
6个回答
252
投票

不,该代码会导致内存泄漏。

release
用于释放被管理对象的所有权而不删除它:

auto v = make_unique<int>(12);  // manages the object
int * raw = v.release();        // pointer to no-longer-managed object
delete raw;                     // needs manual deletion

不要这样做,除非你有充分的理由在没有安全网的情况下处理原始内存。

要删除对象,请使用

reset

auto v = make_unique<int>(12);  // manages the object
v.reset();                      // delete the object, leaving v empty

38
投票

这段代码正确吗?

不。使用

std::unique_ptr<>::reset()
删除内部原始指针:

auto v =  std::make_unique<int>(12);
v.reset(); // deletes the raw pointer

完成后,

std::unique_ptr<>::get()
将返回
nullptr
(除非您向
nullptr
提供非
std::unique_ptr<>::reset()
参数)。


31
投票

这段代码正确吗?

不是,并且会泄漏。

release()
只是释放此
unique_ptr
在被调用之前所持有的内存所有权,并返回调用者现在负责的指针,包括必须手动删除它。

如果你不分配

release()
返回的指针,你就会发生泄漏。

unique_ptr
的显式删除将是
reset()
。但请记住,
unique_ptr
的存在是为了让你不必直接管理它们所持有的内存。也就是说,您应该知道,一旦超出范围,
unique_ptr
将安全地删除其底层原始指针。

因此,您应该有充分的理由对自动内存管理对象执行手动内存管理。


14
投票

release
会泄漏你的原始指针,因为你没有将它分配给任何东西。

它的用途是

int* x = v.release();

这意味着

v
不再管理该指针的生命周期,它将原始指针所有权委托给
x
。如果您只是
release
而不分配任何内容,则会泄漏原始指针。


6
投票

对于任意类型来说可能有点棘手:

  unique_ptr<Foo> v = get_me_some_foo();  // manages the object
  Foo * raw = v.release();        // pointer to no-longer-managed object
  delete raw;

几乎是正确的。

  unique_ptr<Foo> v = get_me_some_foo();  // manages the object
  Foo * ptr = v.release();        // pointer to no-longer-managed object
  v.get_deleter() ( ptr );

这个在所有情况下都是正确的; Foo 类型上可能定义了一个自定义删除器,但使用 unique_ptr 对象返回的删除器适用于所有情况。


0
投票

如果它在系统架构的设计范围内,则可能不会泄漏,如果您确定数据位于其他地方并且在其他地方进行管理,则只需将其丢弃并放弃其他东西拥有的表示形式,然后你得到了一个弱 ptr...这是 C++ 中的一个智能指针...如果你编写每个复制构造函数来删除(除了少数某些类之外),那非常酷。取决于你如何编码......像往常一样。但如果你正在学习..打破它,打破它到高天,你就会看到什么指向哪里以及为什么:)

© www.soinside.com 2019 - 2024. All rights reserved.