5

Borland C++ Builder バージョン 6 で次のコードを実行しているだけです。

for (int i = 0; i < 40000; i++)
{      
   try {
     __int64 n = 0;
     __int64 r = 1 / n;
   }
   catch (Exception& e) {}
}

このループの実行中に、タスク マネージャー ([メモリ] 列) でメモリ リークが発生していることがわかります。理由はありますか?

プロジェクトの計算モジュールで作業しているときに、ゼロで除算しようとするとメモリリークが発生し、メモリリークがどこにあるのか何時間も頭を悩ませた後、上記の単純なループでもメモリリークが発生していることに気付きました。プロジェクトに問題は見つかりませんでした。

4

2 に答える 2

4

標準の 5/4 から、次のことがわかります。

式の評価中に、結果が数学的に定義されていないか、その型の表現可能な値の範囲内にない場合、動作は未定義です。

したがって、ゼロ除算は数学的に定義されていないため、動作は未定義です。未定義の動作にはメモリ リークが含まれるため、なぜメモリ リークが発生しているのかをさらに推測する価値はありません(ただし、valgrind のようなツールを使用するとソースを特定できる場合があります)。

于 2013-09-18T14:13:35.077 に答える