100分:请教SafeArray引起的内存泄露
因为很多原因,需要使用SafeArray对象,在使用过程中发现内存不会释放。仔细排查,定位到SafeArrayGetElement这行引起的问题。测试代码如下:
procedure TForm1.test;
var
opcDataName: Array of string;
opcdata: Array of string;
readValue: array of byte;
i: Integer;
item: string;
readOpcDataName: PSafeArray;
readOpcData: PSafeArray;
VarBound: TVarArrayBound;
AV1: OleVariant;
begin
try
setlength(opcDataName, 300);
setlength(opcdata, 300);
for i := 0 to 300 - 1 do
begin
opcDataName[i] := 'test-test-test' + inttostr(i);
opcdata[i] := '100' + inttostr(i);
end;
VarBound.LowBound := 0;
VarBound.ElementCount := High(opcDataName) + 1;
readOpcDataName := SafeArrayCreate(VT_BSTR, 1, VarBound); // 创建SafeArray对象
readOpcData := SafeArrayCreate(VT_BSTR, 1, VarBound); // 创建SafeArray对象
for i := Low(opcDataName) to High(opcDataName) do
begin
AV1 := opcDataName[i];
SafeArrayPutElement(readOpcDataName, i, TVarData(AV1).VPointer^);
AV1 := opcdata[i];
SafeArrayPutElement(readOpcData, i, TVarData(AV1).VPointer^);
end;
for i := 0 to length(opcDataName) - 1 do
begin
setlength(readValue, 300);
SafeArrayGetElement(readOpcData, i, readValue);//已经确定这行引起的,注释掉就完全正常
item := PChar(@readValue[0]);
opcdata[i] := item; // 循环赋值
setlength(readValue, 0);
end;
finally
safearraydestroy(readOpcDataName);
safearraydestroy(readOpcData);
end;
end;
放在定时器里面循环执行上述函数,发现内存一直在增长!请教各路英雄,如何解决?