类具有虚函数和可访问的非虚析构函数
class has virtual functions and accessible non-virtual destructor
我有两个类:
class A {
public:
virtual void somefunction() = 0;
};
class B : public A {
public:
B();
~B();
void somefunction();
};
B::B() {}
void B::somefunction() {
// some code
}
但是使用g++我得到错误:
class A has virtual functions and accessible non-virtual destructor
class B has virtual functions and accessible non-virtual destructor
我不知道这个错误是什么…我在博客上读到这是一个编译器警告。我该如何解决这个问题?
这是因为您的基类A
没有虚析构函数。例如,如果您有这样的代码:
int main()
{
A* a = new B;
delete a;
}
则delete a
调用不能调用B
的析构函数,因为A
的析构函数不是虚函数。(这会泄漏B
的所有资源。)你可以在这里阅读更多关于虚析构函数的信息。
在基类中添加虚析构函数,应该就没问题了。
class A
{
public:
virtual void somefunction() = 0;
virtual ~A() = default;
}
给出class A:
virtual ~A() { }
这样,如果您通过A*
delete
派生类(如B),它们的自定义析构函数仍然会被调用。
作为经验法则(IMHO),或者简而言之,基类中的析构函数必须是公共和虚拟的,或者是受保护的非虚拟的,以防止内存泄漏。通过这样做,派生类的析构函数被调用,这可以防止在删除保存派生地址/引用的基指针/引用时内存泄漏。
如果一个类有虚函数,那么它的析构函数也应该是虚函数。你的函数有一个可访问的析构函数,但它不是虚函数。
相关文章:
- 读取类的析构函数中的位置时发生访问冲突
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 从析构函数访问模板类构造函数的参数,可以吗?
- 为什么我可以访问已删除但在C++中具有虚拟析构函数的对象?
- 在析构函数 c++ 中访问所有者
- Qlist<QCameraInfo> 导致 QList 析构函数中的访问冲突
- 为什么我在使用组合而不是继承时得到 C4624(无法访问基类析构函数)
- 在析构函数调用后访问成员变量
- mfc应用程序结束后,CMainFrame的析构函数调用发生访问冲突
- 从本地类的 C++ 析构函数访问返回代码
- 在析构函数调用时访问冲突读取位置0xfeeefe2
- 仅在调试时std::string析构函数中存在访问冲突
- 复制构造函数之后的flann::Index的析构函数产生访问冲突
- 限制对C++构造函数和析构函数的访问
- 为什么只有在声明了自定义构造函数时,基类析构函数才能访问
- 无法访问类析构函数中的联合成员
- 虚拟析构函数导致访问冲突
- C++析构函数EXC_BAD_ACCESS无法访问内存
- 类具有虚函数和可访问的非虚析构函数
- 可以访问析构函数中的静态成员的静态对象