web-dev-qa-db-ja.com

shared_ptrアサーションpx!= 0が失敗しました

私は時々アサートのためにクラッシュするかなり複雑なマルチスレッドアプリケーション(サーバー)を持っています:

/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)を試しました。

31
Horacio

共有ポインタを正しく初期化し、すべての共有オブジェクトライブラリに同じメモリ管理コンテキストを使用する限り、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が使用されているモジュールをロード/アンロードすると、混乱が生じる他の問題があります。これを解決するのは非常に困難ですが、この場合は、ゼロ以外のポインターがあります。これは今あなたに起こっていることではありません。

36
jdehaan

あなたはあなたが

常に名前付きスマートポインタ変数を使用して、newの結果を保持します

ここで推奨されているように: boost :: shared_ptr-ベストプラクティス

よろしく、ジョニー

3
Jonny Dee

これが古代の質問を復活させることです。私はちょうどこれを打った、そしてそれはタイミングの問題が原因でした。別のスレッドで初期化を完了する前に、あるスレッドからshared_ptrを使用しようとしました。

したがって、上記のメッセージが表示された場合は、タイミングをチェックして、shared_ptrが初期化されていることを確認してください。

0
Joseph Larson