我有一个c ++程序,可以在gcc(4.8.1),icpc(13.1.3),clang ++(3.3)下编译好,并且运行正常,除了与segfault崩溃的clang ++版本。当我尝试在gdb或lldb调试器中运行它时,我得到地址为0x0的EXC_BAD_ACCESS
。崩溃发生在助手类的成员函数中,调试器声称this
具有值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 ??!
}
可能出现什么问题我该如何找到?注意:问题是 NOT: “我的代码有什么问题?”
编辑1 也许值得一提的是,传递给helper::hbar()
的一些参数已被“编译器优化”,根据调试器,{foo::bar()
1}}),虽然他们在0x0
helper::hbar()
编辑2 如果我从this
中打印出helper::hbar()
的值,则不会发生错误。
编辑3 -O0
以及-O2
发生错误。
编辑4 helper::hbar()
的第一个arg是通过const
引用获得的。如果我按值改变它,一切正常......那个参数是一个空间矢量,类似于std::array<double,3>
。
答案 0 :(得分:0)
一种方法 - 创建一个日志文件,打印pimpl值/某个属于pimpl的变量
pimpl->hbar(...);,
和里面
pimpl->hbar(...);
比较不同编译器的输出,尝试缩小在开始看到分歧时向日志文件中添加更多输出的问题......