【发布时间】:2011-10-01 20:38:51
【问题描述】:
由于boost::/std::shared_ptr 具有擦除其删除器的类型的优势,因此您可以做一些不错的事情,例如
#include <memory>
typedef std::shared_ptr<void> gc_ptr;
int main(){
gc_ptr p1 = new int(42);
gc_ptr p2 = new float(3.14159);
gc_ptr p3 = new char('o');
}
由于保存了正确的删除器,这将正确删除所有指针。
如果您确保接口的每个实现总是使用shared_ptr<Interface>(或make_shared<Interface>)创建,那么您真的需要virtual 析构函数吗?无论如何我都会声明它virtual,但我只是想知道,因为shared_ptr 将始终删除它初始化的类型(除非给出另一个自定义删除器)。
【问题讨论】:
-
shared_ptr magic :) 的可能重复项
-
@Armen:这不是重复的,他不是问
shared_ptr是如何做到的,而是你是否应该使用虚拟析构函数知道shared_ptr做到这一点魔术。 -
@David:不,他没有。他说无论如何他都会使用虚拟析构函数。他在问没有一个是否可以。所以它是重复的
-
是的,这是真的。但是我个人会担心这样做。有一天,我将决定“哦,这不需要 shared_ptr,我将只使用指向基类的指针”,然后一切都微妙地中断了。我认为它是脆弱的代码,外部代码对如何实现类做出合理的假设很容易被破坏,除非我能证明有一个只能通过这样做才能满足的要求,否则我不会这样做。
-
@Kerrek:不,这三种情况的删除器都不同。他们都可能采用
void*,但将其转换为正确的类型,分别为int、float和char。
标签: c++ boost c++11 shared-ptr virtual-destructor