0

C++ 代码:

unique_ptr<int> a  = make_unique<int>(159);
  auto var = a.get(); // Edited a => a.get() sorry
  a.release();
  std::cout<<*var<<std::endl; // prints "159"

这段代码后面是var悬空指针吗?

4

3 回答 3

5

您的代码完全有效。a.release()将动态分配的对象与唯一指针分离,因此a不再拥有该整数,但没有任何内容被删除。

但是,除非您最终不调用delete var,否则您将发生内存泄漏。

于 2014-08-15T13:12:19.380 回答
2

不,这段代码之后var不是悬空指针。是的,如果您不delete显式调用或使用另一个智能指针,您将有内存泄漏。release如果您手动处理智能指针,例如在将指针存储在其他地方后显式调用,智能指针不保证不会出现悬空指针。

顺便说一句,make_unique您使用的功能不是标准的(尽管应该在它的下一个版本中),因此您的代码不可移植。

于 2014-08-15T13:15:59.800 回答
0

这是一个等价的

unique_ptr<int> a  = make_unique<int>(159);
auto var = a.release(); // returns contained pointer and sets a to be empty
std::cout<<*var<<std::endl; // var is still valid here, though you should delete it after
于 2014-08-15T13:08:25.087 回答