【问题标题】:Unused const object of class with virtual desctructor causes segmentation fault具有虚拟析构函数的类的未使用的 const 对象导致分段错误
【发布时间】:2014-07-15 23:54:45
【问题描述】:

在使用 MinGW 在 GCC 下编译的 C++0x 代码中从 main 返回后,我遇到了分段错误,并将其缩小到简单的情况:

class A {
public:
    virtual ~A();
};

A::~A() {
}

const A a;

int main() {
    return 0;
}

原因与:

  1. const 对象前的限定符,删除它会停止 seg 错误,
  2. class A 中缺少构造函数 - 添加空单停止 seg 错误。
  3. compialtor 版本 - 带有 gcc 4.8.1 的较新 TDM MinGW 不会构建导致 seg 错误的代码。

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

受影响的编译器:

gcc --version gcc.exe (tdm-1) 4.7.1

g++ --version g++.exe (tdm-1) 4.7.1

ld --版本 GNU ld (GNU Binutils) 2.22

【问题讨论】:

  • 见this。
  • @yngum:这个限制在 11 之后取消了吗?或者它在最新草稿中的什么位置?
  • @Deduplicator No, 8.5.6 on the latest draft.
  • @Deduplicator 在这种情况下是 8.5§7。

标签: c++ gcc c++11 segmentation-fault mingw


【解决方案1】:

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

struct foo
{
  virtual ~foo () { }
};

int main ()
{
  static const foo tmp;
}

发生错误是因为 gcc 将 const 对象放在只读内存中,因为它可以简单地构造,而无需检查对象是否具有非平凡的析构函数。 virtual 的析构函数尝试更新 vtable 指针,导致段错误。

【讨论】:

  • 这自然会引发一个问题,为什么析构函数调用没有被简单地优化出来......
猜你喜欢
  • 2013-11-01
  • 2012-03-09
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2013-12-08
  • 2017-01-13
  • 2011-05-21
  • 2011-11-16
相关资源
最近更新 更多