6

Delphiコードがあります

var
  a: array of array of array of integer;
begin
  try
   SetLength(a, 100000, 100000, 10000); // out of memory here
   doStuffs(a); 
  except
   a = nil; // try to free the memory 
  end;
end;

上記のコードは大量のメモリを割り当てようとし、out-of-memoryキャッチされます。はa=nil実行されますが、メモリは解放されません。

メモリ不足の例外が発生した場合にメモリを解放する方法はありますか?

試しSetLength(a, 0, 0, 0)てみFinalize(a)ましたが、どちらも機能しません。

4

1 に答える 1

8

一般に、メモリ不足エラーから回復することはできません。その時点で、ヒープが破損している可能性があります。適切な対応は、プロセスを終了することです。

この特定のケースでは、割り当てはユニット内で実行さDynArraySetLengthSystemます。これにより、割り当てが繰り返されます。上記のコードでは、の最後の動作としてのみ、実際に割り当てられDynArraySetLengthた戻り値があります。aまた、でエラーが発生したDynArraySetLength場合、ランタイムは整理する努力をしません。つまり、障害が発生した場合、割り当てられたメモリがリークされ、回復できなくなります。あなたはそれを解放するためにそれを参照する方法がありません。

DynArraySetLengthあなたはそれが片付けるためにもっとするべきだと思うかもしれません。ただし、そのアプローチは正当です。メモリ不足の状態では常​​にヒープが破損するため、整理しようとすると苦痛が長引くだけです。ヒープが停止すると、メモリの割り当てを解除しようとしても意味がありません。

于 2012-09-29T16:54:47.650 に答える