我有一个 c++ 程序,它在 gcc (4.8.1)、icpc (13.1.3)、clang++ (3.3) 下编译良好,并且运行正常,除了 clang++ 版本因段错误而崩溃。当我尝试在 gdb 或 lldb 调试器中运行它时,我得到EXC_BAD_ACCESS
地址 0x0。崩溃发生在帮助类的成员函数中,并且调试器声称this
具有 value 0x0
。但是上一层,pimpl
据报道帮助类的指针有一个非空值,我可以访问它的数据,这看起来非常合理。
这是一些伪代码(...
不是椭圆,而是“一些参数”)
struct helper;
struct foo {
helper* pimpl;
foo(...);
void bar(...);
};
struct helper {
helper(...);
void hbar(...)
{
// crash here with *this = 0x0 according to debugger
}
};
foo::foo(...) : pimpl(new helper(...)) {}
void foo::bar(...)
{
pimpl->hbar(...); // pimpl NOT 0x0 according to debugger ??!
}
可能出了什么问题,我该如何找出答案?注意:问题不是: “我的代码有什么问题?”
编辑 1也许值得一提的是helper::hbar()
,根据调试器的说法,传递给的一些参数已经“被编译器优化” foo::bar()
,而它们的地址0x0
在helper::hbar()
编辑 2如果我打印出this
from inside的值,helper::hbar()
则不会发生错误。
编辑 3错误发生-O0
在 以及-O2
。
编辑 4第一个参数helper::hbar()
是通过const
引用获取的。如果我将其更改为按值,则一切正常....该参数是一个空间向量,类似于std::array<double,3>
.