36

かなり複雑なマルチスレッドアプリケーション(サーバー)があり、アサートが原因でクラッシュすることがあります。

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

4

3 に答える 3

41

boost::shared_ptr共有ポインタを正しく初期化し、すべての共有オブジェクトライブラリに同じメモリ管理コンテキストを使用する限り、使用に問題はありません。

あなたの場合、初期化されていない共有ポインタを使用しようとしています。

boost::shared_ptr<Obj> obj;
obj->Something(); // assertion failed

boost::shared_ptr<Obj> obj(new Obj);
obj->Something(); // ok

可能な限り、宣言時にそれらを初期化することをお勧めします。例外処理は、コードを実行するための多くの「非表示」パスを作成する可能性があり、初期化されていない共有ポインターを識別するのは非常に難しい場合があります。

shared_ptrPS:使用中のモジュールをロード/アンロードすると、混乱を招く他の問題があります。これを解決するのは非常に困難ですが、この場合、ゼロ以外のポインターがあります。これはあなたに今起こっていることではありません。

PPS:使用されるパターンはRAII(リソース獲得は初期化)と呼ばれます

于 2010-08-22T11:55:45.950 に答える
3

あなたはあなたが

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

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

よろしく、ジョニー

于 2011-04-22T20:40:19.443 に答える
0

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

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

于 2019-02-22T20:34:26.740 に答える