我有一条记录,其中包含一些我想要释放的指针。
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。
答案 0 :(得分:2)
据我所知,没有方法支持记录字段迭代。 但是,您可以在较低级别上使用记录结构(请查看此处:http://www.delphigroups.info/2/18/295611.html)
也许您最好重新构建代码,这样就不需要记录指针存储。
答案 1 :(得分:1)
您的Delphi-7版本没有Rtti解决方案。
如果您不想在记录中使用指针数组实现@ ain的建议,
这是一个使用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;