带有虚构造函数的类的未使用const对象导致分段错误

Unused const object of class with virtual desctructor causes segmentation fault

本文关键字:对象 错误 分段 const 未使用 构造函数      更新时间:2023-10-16

我在与MinGW在GCC下编译的c++ 0x代码中从main返回后,正在努力解决分割错误,并将其缩小到简单的情况:

class A {
public:
    virtual ~A();
};
A::~A() {
}
const A a;
int main() {
    return 0;
}

原因与:

  1. 对象前的const限定符,删除它将停止segfault,
  2. class A缺少构造器-添加空一停段故障。
  3. 编译器版本-较新的TDM MinGW与gcc 4.8.1不构建代码导致segfault

我是否触发了一些未定义的行为,或者真的编译器错误是这种行为的原因?

影响编译器:

gcc -版本Gcc.exe (tdm-1) 4.7.1

g++ -版本g++.exe (tdm-1) 4.7.1

ld -版本

这似乎是在4.7.3中修复的gcc错误55893。附加的测试用例与您的非常相似:

struct foo
{
  virtual ~foo () { }
};
int main ()
{
  static const foo tmp;
}

发生错误是因为gcc将const对象放在只读内存中,因为它是平凡的可构造的,而没有检查该对象是否具有非平凡的析构函数。析构函数,是virtual,试图更新虚函数表指针,导致段错误。