2

gcc (4.8.1)、icpc (13.1.3)、clang++ (3.3) で正常にコンパイルされ、segfault でクラッシュする clang++ バージョンを除いて問題なく動作する C++ プログラムがあります。これを gdb または lldb デバッガーで実行しようとするとEXC_BAD_ACCESS、アドレス 0x0 が返されます。thisクラッシュはヘル​​パー クラスのメンバー関数で発生し、デバッガーは value を持っていると主張します0x0。ただし、1 レベル上に行くpimplと、ヘルパー クラスのポインターは null 以外の値を持つことが報告され、そのデータにアクセスできます。これは完全に適切に見えます。

ここにいくつかの擬似コードがあります(...楕円ではありませんが、「いくつかのパラメーター」を意味します)

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 ??!
}

何が間違っている可能性がありますか?どうすれば確認できますか? 注: 質問は「私のコードの何が問題なのですか?」ではありません。

edit 1おそらく、渡された引数の一部はhelper::hbar()、デバッガーによると、)の時点で「コンパイラーによって最適化されてしまった」ことに言及する価値がありますが、それらは内foo::bar()にアドレスを持っています0x0helper::hbar()

edit 2this fromの値を出力しhelper::hbar()てもエラーは発生しません。

edit 3-O0と同様にエラーが発生します-O2

edit 4の最初の引数は、参照helper::hbar()によって取得されconstました。それを値で変更すると、すべて正常に機能します....その引数は、 に似た空間ベクトルでしたstd::array<double,3>

4

1 に答える 1