c++ unique _ ptr : : release ( ) 是否 调用 析 构 函数 ?

7cjasjjr  于 2022-11-20  发布在  其他
关注(0)|答案(5)|浏览(220)

此代码是否正确?

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

它是否等同于原始指针的delete

vngu2lb8

vngu2lb81#

否,该代码会导致内存泄漏。release用于释放托管对象的所有权,a而不 * 删除该对象:

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
rqdpfwrv

rqdpfwrv2#

此代码是否正确?
否。使用std::unique_ptr<>::reset()删除内部原始指针:

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

完成后,std::unique_ptr<>::get()将返回nullptr(除非您为std::unique_ptr<>::reset()提供了非nullptr参数)。

myss37ts

myss37ts3#

此代码是否正确?
它不是,而且会泄漏。
release()只是放弃这个unique_ptr在被调用之前所拥有的内存所有权,并返回一个指针,现在调用者负责该指针,包括必须手动删除它。
如果不对release()返回的指针赋值,就会出现泄漏。
unique_ptr的显式删除是reset()。但请记住,unique_ptr的存在是为了使您不必直接管理它们所拥有的内存。也就是说,您应该知道,一旦unique_ptr超出作用域,它将安全地删除其底层原始指针。
因此,您应该有一个很好的理由对自动内存管理对象执行手动内存管理。

krugob8w

krugob8w4#

release将泄漏原始指针,因为您没有将其赋值给任何对象。
它的用途是

int* x = v.release();

这意味着v不再管理该指针的生存期,它将原始指针的所有权委托给x。如果您只使用release而不赋值,则会泄漏原始指针。

eit6fx6z

eit6fx6z5#

对于任意类型,这可能有点棘手:

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对象返回的删除器对所有情况都有好处。

相关问题