100分:请教SafeArray引起的内存泄露

hpygzhx520 2017-10-23 08:53:21
因为很多原因,需要使用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;

放在定时器里面循环执行上述函数,发现内存一直在增长!请教各路英雄,如何解决?
...全文
532 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hpygzhx520 2017-10-23
  • 打赏
  • 举报
回复
自己发的帖子怎么在列表里面见不到?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧