1. ホーム

二重解放または破損(!prev)エラーについて

2022-02-11 22:13:03

Double free or corruption (!prev)エラーについては、ウェブ上で盛んに議論されていますが、大きく分けて、同じメモリブロックを2回解放した場合と、メモリが範囲外で使われ、後から解放した場合の2つのケースがあります。

私が遭遇した状況を記録する。

クラスAはクラスBを内包しており、クラスBのデストラクタはクラスAのコンストラクタでメモリ解放操作を行う際に 関数本体での代入 ( b=B() ) クラスBに対して初期化操作を行い、インスタンスB()を生成するが、これが重大な問題を引き起こす。生成されたB()は一時的なもので、Aのコンストラクタが終了した後にB()を破棄し、メモリを一旦解放することになるのです。したがって、Aのインスタンスが破壊されると、再びBのデストラクタが呼び出され、二次解放が行われることになります。そして、クラスAのインスタンスbに属していた元のメモリは解放されず、メモリリークが発生します。

正しい方法は、クラスAの初期化リストでクラスBを初期化することです。