大きなループで関数を繰り返し実行しようとしていますが、2〜3回の反復後にエラーが発生しますが、エラーが発生したポイントから開始すると、正常に機能しますが、3〜4回の反復後に再び停止します。メモリに問題がある可能性があります。関数が非常に大きいので、メモリリークが正確にどこにあるのかわかりません。とにかく、各反復後に変数を解放できますか、この問題を解決できるものはありますか?またはそれはリンクリストのメモリの問題なので、すべてのリンクリストまたは何かを解放しますか?解決策は何ですか?関数を1回実行しても問題は発生しないので、ループで関数を繰り返し呼び出しているためと考えられます。この問題を解決する方法はありますか?
エラーは
**glibc detected:.....malloc():smallbin double linked list corrupted: 0x000000000 1d404c0 ***
ライブラリは、メモリメタデータが破損していることを通知しています。これは単なるメモリリークでは発生せず、無効なポインタに書き込む必要がありました。範囲外のインデックスへの書き込みか、解放された後のポインターへの書き込みのいずれかです。
この種の問題をデバッグする最も簡単な方法は valgrind を使用することです。これはLinuxでのみ機能しますが、すでに使用しているようです。プログラムをシングルステップで実行し、すべてのメモリアクセス命令をチェックするため、処理速度はやや遅くなりますが、無効なメモリアクセスや、初期化されていない変数やメモリリークの使用を非常に確実にキャッチできます。
duma(意図しないメモリアクセスを検出する) ライブラリもあります。他のプラットフォームでも動作するように作成でき、少し高速ですが、使用するメモリがはるかに多くなります。
そして、特定のコンパイラオプションによってアクティブ化できるgcc独自の mudflap があります。それはほとんどのgccターゲットで動作するはずですが、C++サポートがどれほど完全かはわかりません。
更新(2018年11月):mudflapは、主に Google Sanitizers によって置き換えられます。これらは Clang の一部です。
警告:非常に具体的な使用例
Qtで作成されたアプリケーションで、コピーコンストラクターを持つQObject
から派生したオブジェクトへのポインターを使用していたときに、この問題が発生しました。コンパイル中に次の警告を見落としました。
warning: base class ‘class QObject’ should be explicitly initialized in the copy constructor [-Wextra]
QObject
派生オブジェクト コピーされないはずです であることがわかりましたが、QObject
派生クラスのコピーコンストラクターがこの種の原因になるとは思っていませんでしたエラーの。