【发布时间】:2015-10-19 14:39:59
【问题描述】:
在使用 g++ 的独立上下文中(没有标准库,例如在操作系统开发中)会发生以下现象:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() {}
};
int main() {
Derived d;
}
链接时它会声明如下内容:undefined reference to operator delete(void*)
这显然意味着 g++ 正在生成对删除运算符的调用,即使动态内存分配为零。如果析构函数不是虚拟的,则不会发生这种情况。
我怀疑这与为类生成的 vtable 有关,但我不完全确定。 为什么会这样?
如果由于缺少动态内存分配例程而不能声明删除操作符,有解决办法吗?
EDIT1:
为了成功重现我使用的 g++ 5.1 中的问题:
g++ -ffreestanding -nostdlib foo.cpp
【问题讨论】:
-
我无法重现这个简单示例的问题。你确定你没有遗漏什么吗?
-
@RobinKrahl 您是否尝试将 -ffreestanding 添加到 g++ 命令行。如果有任何删除操作符的调用,请检查反汇编转储。
-
在我的 Linux Mint 上使用 g++ 4.8.4 编译。使用
g++ Testing.cpp -ffreestanding。但是使用 clang 3.5.0 我得到了一堆链接器错误。 -
也许是一个愚蠢的问题:-nostdlib 做什么? (删除运算符 delete(void*) ?)
-
@DieterLücking 它跳过链接标准 C++ 库(STL、默认运算符、个性、异常处理、堆栈展开等)
标签: c++ delete-operator virtual-destructor