如何解决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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。