C++ 中的继承:析构函数 C.127:具有虚函数的类应该有一个虚或受保护的析构函数

问题描述

我在每个派生类使用的抽象基类中添加了一个受保护的成员数组,如果基类的析构函数是虚拟的,或者我可以这样做:

**~base(){
   delete[] array;
}**

解决方法

两者都有!

您可以为基析构函数提供一个定义(即使它是纯虚拟的!),如果基是资源所在的位置,那么基是应该清理它的位置。


或者,为自己准备一个好std::vector,这样一切都为您完成了。

,

我在抽象基类中添加了一个受保护的成员数组,每个 派生类使用,应该基类的析构函数是虚拟的

是的。

当你使用多态时,析构函数也应该是虚拟的。

对此有官方指南:

CppCoreGuidelines/CppCoreGuidelines.md at master · isocpp/CppCoreGuidelines · GitHub

C.127:具有虚函数的类应该有一个虚或受保护的析构函数

原因

具有虚函数的类通常(并且通常)通过指向基类的指针使用。通常,最后一个用户必须在指向基的指针上调用 delete,通常是通过指向基的智能指针,因此析构函数应该是公共的和虚拟的。不太常见的是,如果不打算支持通过指向 base 的指针删除,析构函数应该是受保护的和非虚拟的;见C.35

例子,坏
struct B {
    virtual int f() = 0;
    // ... no user-written destructor,defaults to public non-virtual ...
};

// bad: derived from a class without a virtual destructor
struct D : B {
    string s {"default"};
};

void use()
{
    unique_ptr<B> p = make_unique<D>();
    // ...
} // undefined behavior,might call B::~B only and leak the string
笔记

有些人不遵守这个规则,因为他们打算只通过shared_ptr来使用一个类:std::shared_ptr<B> p = std::make_shared<D>(args);这里,共享指针会负责删除,所以不会发生泄漏来自不适当的 delete 基地。持续这样做的人可能会得到误报,但规则很重要——如果使用 make_unique 分配会怎样?它是不安全的,除非 B 的作者确保它永远不会被滥用,例如通过将所有构造函数设为私有并提供工厂函数来强制使用 make_shared 进行分配。

执法
  • 具有任何虚函数的类应该具有公共和虚拟或受保护和非虚拟的析构函数。
  • 标记具有虚函数但没有虚析构函数的类的 delete

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...