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()
にアドレスを持っています0x0
helper::hbar()
edit 2this
fromの値を出力しhelper::hbar()
てもエラーは発生しません。
edit 3-O0
と同様にエラーが発生します-O2
。
edit 4の最初の引数は、参照helper::hbar()
によって取得されconst
ました。それを値で変更すると、すべて正常に機能します....その引数は、 に似た空間ベクトルでしたstd::array<double,3>
。