我认为一切都在问题中。我想知道为什么 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)
这是由标准中的注释回答的:
[unique.ptr.single.modifiers/4]:效果:分配p给存储的指针,然后当且仅当存储的指针的旧值old_p不等于 时nullptr,才调用get_deleter()(old_p)。[注意:这些操作的顺序很重要,因为调用get_deleter()可能会破坏*this. — 尾注]
换句话说,它可能不delete ptr只是一些其他更复杂的东西(在删除器内部),如果那个复杂的东西破坏了unique_ptr它本身,则分配给存储的指针将具有未定义的行为。
不过,我无法解释为什么删除器会这样做。
另外,请注意get_deleter()(根据前一段)不允许抛出异常。