今日、私はこの質問をしました。
この問題の調査に時間を費やした後、何が起こっているのかを発見しました。別の問題として追跡するのに十分興味深いと思うので、これを新しい質問として投稿しています。その質問を回答(およびこれへのリンク)で更新します。
デバッガーからの単体テストの起動
// Construct object
Object* pObject = new Object(...);
// Pointer value of pObject == 0x05176960
// Lots of other code
// ...
// Destroy object
delete pObject;
// Construct object again
pObject = new Object(...);
// Pointer value of pObject == 0x05560194 /* Different memory location */
コマンドラインから単体テストを起動する
// Construct object
Object* pObject = new Object(...);
// Pointer value of pObject == 0x05176960
// Lots of other code
// ...
// Destroy object
delete pObject;
// Construct object again
pObject = new Object(...);
// Pointer value of pObject == 0x05176960 /* Same memory location */
要約すれば:
- コマンド ラインから単体テストを起動すると、 (新しいものを割り当てる前に前のものを)
new
を割り当てるための後続の呼び出しは、常にメモリ内の同じアドレスを返します。Object
delete
Object
- デバッガーから単体テストを起動すると、 (新しいものを割り当てる前に前のものを)
new
を割り当てるための後続の呼び出しは、常にメモリ内の一意のアドレスを返します。Object
delete
Object
問題は、コマンド ラインから起動すると、 の割り当ては常にメモリ内で同じアドレスを取得するため、古いObject
ポインターを格納しているアクセス中のマップを引き続き使用でき、テストがクラッシュしないことです。しかし、欠陥の修正が行われていないときに単体テストをクラッシュさせて、黙って失敗したり、欠陥が再発したりしないようにしたいと考えています。
私の質問には2つの部分があります:
コマンド ラインから単体テストを起動すると、ヒープ マネージャーがメモリの同じ部分を再利用するのに、デバッガーから単体テストを起動すると再利用しないのはなぜですか?
単体テストを正しく記述できるようにするために、テスト ハーネスで使用できるコンパイラ設定、または削除したメモリのセクションをヒープ マネージャーが再利用するのを防ぐために呼び出すことができるメソッドはありますか? 1
1明らかにこれを行う 1 つの方法は、元のオブジェクトを削除しないことですが、これを割り当てるコードの一部は私の運用コードにあり、これを行うとメモリ リークが発生します。