web-dev-qa-db-ja.com

「破損した二重リンクリスト」エラーの原因は何ですか?

かなり複雑なコードで問題が発生しています。エラーを再現する短いスニペットを作成できなかったので、問題を言葉で説明しようと思います。

コードはエラーでランダムにクラッシュします

*** glibc detected *** gravtree: corrupted double-linked list: 0x000000001aa0fc50 ***

デバッグは、それがコードがオブジェクトを解放する行から来ていることを示しました。オブジェクトに問題はないようです。それは存在し、エラーが発生したときにそのデータにアクセスできます。オブジェクトのデストラクタは些細なものであり、何もしません。

だから、私はちょっと立ち往生しています。どのような状況で「無料」が失敗すると思いますか?

20
hanno

Valgrind でプログラムを実行してみてください。それはあなたに以前の原因を指摘するかもしれませんが、gdbはすでにダメージが発生している場所にのみ侵入しています。

11
Warren Young

ウォーレンが言ったように、Valgrindは通常それを見つけるための最良の方法です。二重リンクリストは、通常、ネットワークまたはバイナリデータハンドラーのベースです。つまり、QT QByteArrayまたはQTcpSocketにあります。今日も同じことがありました。それは、オブジェクトをマップから削除して無効にしたが、以前にその中のデータへのポインターを取得していたためです。それは時々機能し、時には機能しませんでした。システムの負荷が高いほど、クラッシュする可能性が高くなります。

0
Chris Benesch