QNXでコードが定期的にクラッシュしています。 std::call_once
を使用して初期化怠惰である0x85dd6ac
オブジェクトのSTD ::マップのメンバ変数にアクセスしようとしているときにアドレス0x85dd6ac
でメモリにアクセスすることはできません)std :: call_once QNXの遅延初期化問題
:それは変数を読み込みエラー
エラーでクラッシュします。
get()
によって返されたオブジェクトは、プロセスがクラッシュしているアクセスされたいくつかの点でmutable std::aligned_storage<sizeof(A), alignof(A) >::type m_value; void init(A *ptr) { new (ptr) A(); } inline T* data() const { return reinterpret_cast<A*>(&m_value); } const A& get() const { std::call_once(m_once_flag, init, data()); return *data(); }
:
は、初期化は、次の擬似コードを用いて行われます。
他のプラットフォームでは、問題は再現されず、デバッグするのが非常に困難です。 コードから、オブジェクトが初期化されず、その時点で削除できないことがわかります。
std::call_once
の実装では、スレッドの安全性またはメモリの順序付けで問題が発生する可能性があります。 誰かがQNXプラットフォームのstd :: call_onceやそのようなバグの経験がありますか? 問題をどのように見つけることができますか?
GCCを使用していますか?野生の推測:QNX Pthreadsの実装では、静的オブジェクトに対してPTHREAD_ONCE_INITを使用することのみがサポートされており、 'std :: once_flag'タイプのデータメンバーの使用は機能しません。 'm_once_flag'の代わりにグローバルな' std :: once_flag'を使うと違いがありますか? (これは、オブジェクトごとに一度ではなく、一度だけinitを実行できることを意味していますが、問題を追跡するのに役立ちます)。 –
@Jonathan、それは 'mutable'なので、非静的なデータメンバでなければなりません(接頭辞「m_」は強く示唆しています) –
なぜ、格納する必要があるときだけ変数をマップに格納しないのですか?私はそれを取得しません –