为什么 unique_ptr::reset 在替换后删除对象

Ant*_*ier 2 c++

我认为一切都在问题中。我想知道为什么 unique_ptr 删除是这样处理的:

auto ptr = m_ptr;
m_ptr = newPtr;
delete ptr;
Run Code Online (Sandbox Code Playgroud)

并不是

delete m_ptr;
m_ptr = newPtr;
Run Code Online (Sandbox Code Playgroud)

Ast*_*ngs 5

这是由标准中的注释回答的:

[unique.ptr.single.modifiers/4]: 效果:分配p给存储的指针,然后当且仅当存储的指针的旧值old_­p不等于 时nullptr,才调用get_­deleter()(old_­p)[注意:这些操作的顺序很重要,因为调用get_­deleter()可能会破坏*this. — 尾注]

换句话说,它可能不delete ptr只是一些其他更复杂的东西(在删除器内部),如果那个复杂的东西破坏了unique_ptr它本身,则分配给存储的指针将具有未定义的行为。

不过,我无法解释为什么删除器会这样做。

另外,请注意get_deleter()(根据前一段)不允许抛出异常。