为什么unique_ptr将删除器作为类型参数而shared_ptr没有?

R. *_*des 60 c++ smart-pointers type-erasure

std::unique_ptr模板有两个参数:指针对象的类型和删除器的类型.第二个参数有一个默认值,所以你通常只写一些像std::unique_ptr<int>.

std::shared_ptr模板有虽然只有一个参数:指针对象的类型.但是你也可以使用自定义删除器,即使删除类型不在类模板中.通常的实现使用类型擦除技术来执行此操作.

有没有理由不使用相同的想法std::unique_ptr

Pup*_*ppy 38

部分原因是shared_ptr无论如何都需要一个明确的控制块用于引用计数并且保留一个删除器并不是最重要的.unique_ptr但是不需要任何额外的开销,并且添加它将是不受欢迎的 - 它应该是零开销类.unique_ptr应该是静态的.

如果你想要这样的行为,你总是可以在顶部添加自己的类型擦除 - 例如,你可以拥有unique_ptr<T, std::function<void(T*)>>我过去做过的事情.

  • +1.类型擦除不是一件"好事",它更像是一种必要的邪恶.如果你可以使用更简单的解决方案,那么你应该.`unique_ptr`是比`shared_ptr`更简单,更轻量级的智能指针. (8认同)