2

我有一个 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(),而它们的地址0x0helper::hbar()

编辑 2如果我打印出thisfrom inside的值,helper::hbar()则不会发生错误。

编辑 3错误发生-O0在 以及-O2

编辑 4第一个参数helper::hbar()是通过const引用获取的。如果我将其更改为按值,则一切正常....该参数是一个空间向量,类似于std::array<double,3>.

4

1 回答 1

0

一种方法 - 创建一个日志文件,打印 pimpl 的值/之前属于 pimpl 的某个变量

pimpl->hbar(...);, 

和里面

pimpl->hbar(...);

比较来自不同编译器的输出,尝试缩小问题,当您开始看到分歧时,将更多输出添加到日志文件......

于 2013-09-11T14:59:40.360 回答