【发布时间】:2015-09-30 15:27:26
【问题描述】:
许多文档都指出在分配时复制了托管对象。似乎没有人谈论删除器或控制块。
例如:
std::shared_ptr<A> a(new A, D());
std::shared_ptr<A> b;
b = a;
如果 b 是最后剩下的所有者并且 b 超出范围,是否会调用自定义删除器 D()?
【问题讨论】:
标签: c++ shared-ptr
许多文档都指出在分配时复制了托管对象。似乎没有人谈论删除器或控制块。
例如:
std::shared_ptr<A> a(new A, D());
std::shared_ptr<A> b;
b = a;
如果 b 是最后剩下的所有者并且 b 超出范围,是否会调用自定义删除器 D()?
【问题讨论】:
标签: c++ shared-ptr
是的。创建对象时设置删除器。共享指针管理具有删除器的控制结构中的引用计数。
std::shared_ptr<A> a(new A, D());
这一行创建一个新的共享对象,其控制结构包含一个删除器和一个引用计数。它还创建一个指向该对象和控制结构的共享指针。
std::shared_ptr<A> b;
b = a;
这会创建对该对象和控制结构的第二个引用,将其引用计数增加到两个。
保存共享对象的唯一引用计数的同一结构还包含删除器。
【讨论】: