【发布时间】:2021-09-01 00:40:27
【问题描述】:
调用void reset( pointer ptr = pointer() ) noexcept; 会调用以下操作
给定 current_ptr,由 *this 管理的指针按此顺序执行以下操作:
- 保存当前指针 old_ptr = current_ptr 的副本
- 用参数 current_ptr = ptr 覆盖当前指针
- 如果旧指针非空,则删除之前管理的对象 if(old_ptr) get_deleter()(old_ptr)。
这个特定订单的原因是什么?为什么不只做 3) 然后 2)?在这个问题std::unique_ptr::reset checks for managed pointer nullity? 第一个答案引用了标准
[...] [ 注意:这些操作的顺序很重要,因为调用 get_deleter() 可能会破坏 *this。 ——尾注]
这是唯一的原因吗? get_deleter()怎么会毁掉unique_ptr(*this)?
【问题讨论】:
-
说这个
unique_ptr指向某个对象A,又是某个对象B的数据成员。A的析构函数可能会删除B,这反过来又会破坏指针。你希望它在那个时候为空,否则你最终会遭受双重破坏。 -
如果有析构函数抛出,那么这个命令也更安全(不好的做法)
-
@Phil1970 析构函数不能抛出。
-
@prehistoricpenguin 这是个坏主意,语言默认为 noexcept 析构函数,但可以做到。
-
@IgorTandetnik 您能否从实践中指定一个示例,其中
A的析构函数将删除B?我自己也无法想象。
标签: c++ unique-ptr