在使用g ++的独立上下文(没有标准库,例如在操作系统开发中)中,会出现以下现象:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() {}
};
int main() {
Derived d;
}
Run Code Online (Sandbox Code Playgroud)
链接时,它表示如下: undefined reference to operator delete(void*)
这显然意味着即使动态内存分配为零,g ++也会生成删除运算符的调用.如果析构函数不是虚拟的,则不会发生这种情况.
我怀疑这与课堂生成的vtable有关,但我不完全确定.为什么会这样?
如果由于缺少动态内存分配例程而不能声明删除操作符,是否有解决方法?
EDIT1:
为了成功地重现g ++ 5.1中的问题,我使用了:
g ++ -ffreestanding -nostdlib foo.cpp
在下面的简单代码片段中:
#include <cstddef>
struct B
{
virtual ~B() = default;
static void operator delete(void *, int);
static void * operator new(size_t, int);
};
struct C : B
{
virtual ~C() = default;
};
Run Code Online (Sandbox Code Playgroud)
clang 3.7抱怨"未删除的功能'〜C'无法覆盖已删除的功能":http: //goo.gl/Ax6oth
Visual Studio和GCC都没有在此代码中报告错误.这是一个铿锵的缺陷还是什么?