shared_ptr 作业 - 自定义删除器也被复制了吗?

shared_ptr assignment - is custom deleter copied too?

许多文档都指出在分配时复制了托管对象。似乎没有什么是关于删除器或控制块的。

例如:

std::shared_ptr<A> a(new A, D());
std::shared_ptr<A> b;

b = a;

如果 b 是最后剩下的所有者并且 b 超出范围,是否会调用自定义删除器 D()?

是的。创建对象时设置删除器。共享指针管理具有删除器的控制结构中的引用计数。

std::shared_ptr<A> a(new A, D());

此行创建一个新的共享对象,其控制结构包含一个删除器和一个引用计数。它还会创建指向该对象和控制结构的共享指针。

std::shared_ptr<A> b;
b = a;

这将创建对该对象和控制结构的第二个引用,将其引用计数增加到两个。

保存共享对象的唯一引用计数的相同结构也包含删除器。