0

動的に割り当てられたアドレス空間へのポインターがスタックを離れるとすぐに、メモリを自動的に解放するのに役立つ何かをプログラムしたいと思います。例は次のとおりです。

procedure FillMemory (var mypointer);
begin
  // CopyMemory, Move, etc... with data
end;

procedure MyProcedure;
var
  MyPointer : Pointer;
begin
  MyPointer := VirtualAlloc (NIL, 1024, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  FillMemory (MyPointer);
  VirtualFree(MyPointer, 0, MEM_RELEASE); // I would like to avoid this...
end;

文字列を使用することもできますが、それらを避けたいと思います (とにかくスタック内の文字列が解放されるかどうかはわかりません...) アイデアはありますか?

4

2 に答える 2

4

アリオクとの私のコメントと議論をさらに発展させるために、

生のメモリ ブロックだけが必要な場合は、動的なarray of byte. コンパイラは、メソッドの最後でこのメモリを解放するコードを生成します。

type
  TBytes = array of Byte; // omit for newer Delphi versions

procedure FillMemory(var Bytes: TBytes);
begin
  { passing in here will increase the reference count to 2 }
  // CopyMemory, Move, etc... with data
end; // then drop back to 1

procedure MyProcedure;
var
  Buffer : TBytes;
begin
  SetLength(Buffer, 1024);  // buffer has reference count of 1
  FillMemory (Buffer);
end;   // reference count will drop to 0, and Delphi will free memory here

これがすべて理にかなっていることを願っています。ここは真夜中なので、あまり目が覚めていないようです...

于 2013-07-15T12:02:02.833 に答える