当我们将 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>();
}
最佳答案
是的,当然,即使对于多态类型,也没有虚拟 dtor 也有好处:
在宏伟的计划中,这两种影响通常都是微不足道的:
另一方面,如果您(或其他人)滑倒(或忽略策略)并编写依赖于此的代码,那么没有虚拟 dtor 的基础可能会非常危险。未定义的行为很少有趣。
这就是为什么每个人都坚持认为,如果发生任何动态多态性(任何虚函数、dtor、基或具有相同的基),那么 dtor 最好也是虚拟的!
关于c++ - 如果未使用 shared_ptr 定义虚拟析构函数,是否有任何优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63362025/