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的东西,但我不知道如何在记录和Delphi 7中正确使用它。

4

2 回答 2

2

As far as I'm aware there are no methods to support record field iteration. You can however play with the record structure on a low level basis (look here: http://www.delphigroups.info/2/18/295611.html)

Maybe you are better off restructuring your code so you will not need records for pointer storage.

于 2013-02-04T15:01:22.240 回答
1

您的 Delphi-7 版本没有 Rtti 解决方案。

如果您不想在记录中使用指针数组来实现@ain 的建议,这里有一个使用 avariant 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 回答