重新分配std :: unique_ptr时是否释放内存?

时间:2020-08-14 21:47:07

标签: c++ memory memory-leaks smart-pointers unique-ptr

给出以下内容:

{
    std::unique_ptr<char[]> foo;
    foo = std::make_unique<char[]>(100);
    foo = std::make_unique<char[]>(200);
}

在第二次调用中重新分配foo时,第一次调用make_unique分配的内存是否被释放?

3 个答案:

答案 0 :(得分:8)

此代码没有泄漏。 std::unique_ptr的{​​{3}}在从已分配给另一个Deleter的所有权转移所有权时,将调用现有内存的delete[](在本示例中为unique_ptr

每个cppreference:

operator=

将所有权从r转移到*this,就像通过调用reset(r.release()),然后从get_deleter()分配std::forward<E>(r.get_deleter())一样。

std::unique_ptr<T,Deleter>::operator=

给出current_ptr管理的指针*this,按此顺序执行以下操作:

  • 保存当前指针old_ptr = current_ptr的副本
  • 使用参数current_ptr = ptr覆盖当前指针
  • 如果旧指针为非空,则删除以前管理的对象
    if(old_ptr) get_deleter()(old_ptr)

答案 1 :(得分:2)

您只定义一次foo
具体来说,在范围的第一行:

std::unique_ptr<char[]> foo;

由于它是默认初始化的,因此会调用default-ctor,它以nullptr进行初始化。

另外两行为foo分配了一个新值,没有重新定义,这将是错误

是的,如果您为foo分配一个新值,则分配操作员将释放以前拥有的内存,这是有保证的。

答案 2 :(得分:1)

是的,unique_ptr具有数组专门化功能,当unique_ptr超出范围时,它将调用整个数组范围的析构函数:

https://en.cppreference.com/w/cpp/memory/unique_ptr

在上一个示例中可以看到,它创建一个D数组,然后为所有已创建的D调用析构函数。