相关疑难解决方法(0)

为什么虚拟析构函数需要删除运算符

在使用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

c++ delete-operator virtual-destructor

13
推荐指数
1
解决办法
1473
查看次数

没有删除任何功能时,Clang会抱怨"无法覆盖已删除的功能"

在下面的简单代码片段中:

#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都没有在此代码中报告错误.这是一个铿锵的缺陷还是什么?

overriding language-lawyer virtual-destructor c++11 clang++

6
推荐指数
1
解决办法
1857
查看次数