私は時々アサートのためにクラッシュするかなり複雑なマルチスレッドアプリケーション(サーバー)を持っています:
/usr/include/boost/smart_ptr/shared_ptr.hpp:418: T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = msg::Player]: Assertion `px != 0' failed.
原因を特定できず、これがboost :: shared_ptrの問題なのか、それとも私ですか?
私はg ++ 4.4.3-4ubuntu5とllvm-g ++(GCC)4.2.1を最適化あり、最適化なしで試し、libboost1.40-dev(= 1.40.0-4ubuntu4)を試しました。
共有ポインタを正しく初期化し、すべての共有オブジェクトライブラリに同じメモリ管理コンテキストを使用する限り、boost::shared_ptr
の使用に問題はありません。
あなたのケースでは、初期化されていない共有ポインタを使用しようとしています。
boost::shared_ptr<Obj> obj;
obj->Something(); // assertion failed
boost::shared_ptr<Obj> obj(new Obj);
obj->Something(); // ok
可能な限り、宣言時にそれらを初期化することをお勧めします。例外処理は、コードを実行するための多くの「見えない」パスを作成する可能性があり、初期化されていない共有ポインターを識別するのは非常に難しい場合があります。
PS:shared_ptr
が使用されているモジュールをロード/アンロードすると、混乱が生じる他の問題があります。これを解決するのは非常に困難ですが、この場合は、ゼロ以外のポインターがあります。これは今あなたに起こっていることではありません。
これが古代の質問を復活させることです。私はちょうどこれを打った、そしてそれはタイミングの問題が原因でした。別のスレッドで初期化を完了する前に、あるスレッドからshared_ptrを使用しようとしました。
したがって、上記のメッセージが表示された場合は、タイミングをチェックして、shared_ptrが初期化されていることを確認してください。