给出以下内容:
{
std::unique_ptr<char[]> foo;
foo = std::make_unique<char[]>(100);
foo = std::make_unique<char[]>(200);
}
在第二次调用中重新分配foo时,第一次调用make_unique分配的内存是否被释放?
答案 0 :(得分:8)
此代码没有泄漏。 std::unique_ptr
的{{3}}在从已分配给另一个Deleter
的所有权转移所有权时,将调用现有内存的delete[]
(在本示例中为unique_ptr
)
每个cppreference:
将所有权从
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调用析构函数。