2

解放したいポインタの束を含むレコードがあります。

type 
 FreeStruct = record
 Addr1 : Pointer;
 Addr2 : Pointer;
 Addr3 : Pointer;
 // ....
end;

だから私は次のようなことをしたいと思います:

var
 MyStruct : FreeStruct:
begin
 //MyStruct.Addr1 := ...;
 for i := 0 to NumberOfFieldsInRecord do begin
  VirtualFree (ValueOfFieldNumberOfMyStruct[I],0, MEM_RELEASE);
 end;
end;

RTIIのようなものがあると聞きましたが、レコードやDelphi7で適切に使用する方法がわかりません。

4

2 に答える 2

2

私の知る限り、レコードフィールドの反復をサポートする方法はありません。ただし、低レベルでレコード構造を操作することはできます(http://www.delphigroups.info/2/18/295611.htmlを参照) 。

ポインタを保存するためのレコードが不要になるように、コードを再構築したほうがよいかもしれません。

于 2013-02-04T15:01:22.240 に答える
1

Delphi-7バージョンにはRttiソリューションはありません。

レコード内のポインターの配列を使用して@ainの提案を実装したくない場合は、aを使用しvariant part in the recordて同様のことを実行する提案を次に示します。myStruct.AddrXコードをわかりやすくするために名前を自由に使用できますがmyStruct.allAddresses[X-1]、同じフィールドに対応することもできます。

Type
  FreeStruct = 
    record          
      intExample : Integer;  // not in the variant part

      case boolean of // Variant structure where the different parts overlap in memory
      true : ( Addr1 : Pointer;
               Addr2 : Pointer;
               Addr3 : Pointer);
      false : (allAddresses : array[0..2] of Pointer);          
    end;

procedure ClearFreeStruct( var AStruct : FreeStruct);
var
  i: Integer;
begin
  for i := 0 to High(AStruct.allAddresses) do 
  begin
    // Dispose of allocated pointers
  end;
end;

より多くのポインタを使用して構造を拡張できますが、他のフィールド(バリアント部分の前)を含めることもできます。


明確さをあきらめることなく、レコード内でポインターの配列を使用することが可能です。を使用することにより、enumeration各ポインタを関連する名前でアドレス指定することができます。

例:myStruct.Addr [peAddr1]

Type
  PointerEnum = (peAddr1,peAddr2,peAddr3);

  FreeStruct =
    record
      intExample : Integer;

      Addr : array[PointerEnum] of Pointer;
    end;

procedure ClearFreeStruct( var AStruct : FreeStruct);
var
  pe : PointerEnum;
begin
  for pe := Low(PointerEnum) to High(PointerEnum) do
  begin
    // Dispose(AStruct.Addr[pe]);
  end;
end;
于 2013-02-04T16:40:34.070 に答える