由于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
将始终删除其初始化的类型(除非提供另一个自定义删除器)。
delete(void*)
。我没有看到自定义删除器和通过基指针进行删除之间的联系。 - Kerrek SBvoid*
,但分别将其转换为正确的类型,即int
、float
和char
。 - Xeo