带有虚构造函数的类的未使用const对象导致分段错误
Unused const object of class with virtual desctructor causes segmentation fault
我在与MinGW在GCC下编译的c++ 0x代码中从main返回后,正在努力解决分割错误,并将其缩小到简单的情况:
class A {
public:
virtual ~A();
};
A::~A() {
}
const A a;
int main() {
return 0;
}
原因与:
- 对象前的
const
限定符,删除它将停止segfault, -
class A
缺少构造器-添加空一停段故障。 - 编译器版本-较新的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
,试图更新虚函数表指针,导致段错误。
相关文章:
- 对象错误地显示为引用?
- 调用带有指针对象错误的指针变量
- 为什么谷歌测试/模拟显示 std::unique_ptr 泄露的模拟对象错误?
- C 数组指向对象错误
- C++:对象错误的多重定义
- 子数组分配:使用聚合对象错误的预期"{...}"进行初始化
- C 字符串对象错误字符
- 声明 Windows API 结构 (DCB) 的对象 - 错误 C4430:缺少类型说明符 - 假定为 int
- 无法调用成员函数而不出现对象错误
- C++指针/对象错误
- C++排序矢量对象错误
- C++:在映射中存储类对象(错误:获取类型为"Node"的临时对象的地址)
- 使用三元运算符初始化类对象错误
- 帧缓冲区对象错误
- 实例化新对象 - 错误
- C++打印出对象错误
- 如何更正类型对象错误
- 简单指针对象错误C++
- 运算符重载添加两个对象错误
- c++列表对象错误