C++: double free or corruption
C++で同じメモリを二重解放した場合のエラー
概要
C++で同じメモリ領域を2回以上解放しようとした場合に発生するエラーです。ヒープの破損を引き起こす深刻なバグです。
エラーメッセージ
*** Error in `./program': double free or corruption (fasttop): 0x0000000001234567 ***
Aborted (core dumped)
または
free(): double free detected in tcache 2
原因
- 同じポインタを複数回delete: 明示的に2回削除
- 浅いコピー: コピーされたオブジェクトが同じメモリを共有
- デストラクタの重複呼び出し: 手動デストラクタ呼び出し後の自動解放
- ダングリングポインタ: 解放済みメモリへの参照
解決策
1. delete後はnullptrを設定
| |
2. スマートポインタを使用
| |
3. コピーコンストラクタを正しく実装
| |
4. Rule of Three/Five を守る
| |
5. AddressSanitizerで検出
| |
6. valgrindで検出
| |
よくある間違い
- STLコンテナに生ポインタを格納してコピー
- 例外発生時のリソース解放漏れ
- コピー禁止クラスでコピーを許可している
- 継承時の仮想デストラクタ忘れ
C++ の他のエラー
この記事は役に立ちましたか?