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

时间:2014-09-01 15:57:40

标签: c++ unique-ptr

这段代码是否正确?

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

它等同于原始指针的delete吗?

5 个答案:

答案 0 :(得分:103)

不,代码会导致内存泄漏。 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

答案 1 :(得分:21)

  

这段代码是否正确?

没有。使用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()参数。)

答案 2 :(得分:17)

  

这段代码是否正确?

它不会,也会泄漏。

release()让调用代码收回unique_ptr所持有的内存的所有权,直到调用它为止。如果您没有指定release()返回的指针,那么您只会有泄漏。

unique_ptr的明确删除是reset()。但请记住unique_ptr存在,以便您不必直接管理他们所拥有的内存。也就是说,你应该知道unique_ptr一旦超出范围就会安全地删除它的底层原始指针。

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

答案 3 :(得分:11)

release会泄漏您的原始指针,因为您没有将其分配给任何内容。

用于

之类的东西
int* x = v.release();

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

答案 4 :(得分:1)

任意类型可能有点棘手:

  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对象返回的删除器适用于所有情况。