【发布时间】:2020-12-01 08:18:55
【问题描述】:
当我们将 shared_ptr 与多态类一起使用时,由于类型擦除删除器,我们不需要虚拟析构函数。
但是在简单的情况下定义析构函数有意义吗?
根本不声明析构函数有什么好处?
考虑下面的代码
struct Base {
/*virtual*/ ~Base() { std::cout << "Base Dtor" << std::endl; }
OR
/*virtual*/ ~Base() = default;
virtual void foo() = 0;
};
struct Derived : Base {
~Derived() { std::cout << "Derived Dtor" << std::endl; }
void foo() override { std::cout << "foo" << std::endl; }
};
int main() {
std::shared_ptr<Base> ptr = std::make_shared<Derived>();
}
【问题讨论】:
-
@Story 真的吗? OP 没有问他是否必须有一个虚拟 dtor,也没有问他是否应该有一个虚拟 dtor。相反,他问没有虚拟 dtor 是否有任何优势。而另一个帖子没有问这个,也没有唯一的答案刷在上面。
-
TBH,我仍然会宣布析构函数 virtual 出于偏执。通过代码库远角的一行上的接口指针意外删除太容易了。虚拟析构函数的大小和性能成本不太可能很高,它为所有删除设置了一个广泛的安全网。权衡是值得的,IMO。
-
分析会告诉你 cdhowie 的假设是否被证明是错误的。它可能不会。您可以改进一些更大的东西。
标签: c++ memory polymorphism shared-ptr virtual-destructor