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

Cra*_*ins 2 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 10

这段代码没有泄漏。 当从分配给它的另一个所有权转移时,operator=forstd::unique_ptr将调用现有内存的Deleter(在本例中为delete[]unique_ptr

每个 cppreference:

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

将所有权从rto转移,*this就像通过调用reset(r.release())后跟get_deleter()from的赋值一样std::forward<E>(r.get_deleter())

std::unique_ptr<T,Deleter>::reset

鉴于current_ptr,由 管理的指针按*this以下顺序执行以下操作:

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