请大家帮忙看看FastMM报的内存漏洞

hapland 2015-01-23 02:37:55
下面的代码执行后,FastMM报内存漏洞.

对象的属性中Altns和Strips都是动态数组,
但是我在结束的时候也逐次用SetLength释放了

我不知道原因在哪里和怎么修改
请各位大侠提出建议
谢谢!

-----------------------------------------

//定义部分
//SStrips声明
type SStrip = record
JobType : Integer;
UpDst, DnDst : Double;
MchnID : Integer;
BlksVol : SVolAndSpls;
end;
type TStrips = Array of SStrip;
//SAltern声明
type SAltern = record
BlkObjID : Integer;
MchnGrpID : Integer;
Strips : TStrips;
Tried : ShortInt;
MachEquiped : Boolean;
ValidNow : Boolean;
Wght : Double;
end;
TAlterns = array of SAltern;
//SMatch的声明
type SMatch = record
SN : Integer;
Altns : TAlterns;
AltnsStr : TLongUnicodeString;
SaveTime : TDateTime;
Modified : Boolean;
ObjID, SvdSN : Integer;
end;
PSMatch = ^SMatch;

//相关执行部分
function EquipMchn4Prep(AMtchIdx : Integer; ACurTime : TDateTime) : Integer;
var
ArrCnt, ArrIdx, AvailCnt : Integer;
MchnCnt, MchnIdx : Integer;
IdxArr : TArrInt;
AItem : PSCable;
AMtch : PSMatch;
begin
Result := -1;
AMtch := PrepMtchs.Items[AMtchIdx]; //Items和SavedItems是TList类型,保存着指针.

ArrCnt := Length(AMtch^.Altns); AvailCnt := 0;
for ArrIdx := 0 to ArrCnt - 1 do
if (AMtch^.Altns[ArrIdx].Tried = 0) then
begin
AMtch^.Altns[ArrIdx].MachEquiped := False;

if AMtch^.Altns[ArrIdx].ValidNow then
begin
MchnCnt := CblCrns.Items.Count;
for MchnIdx := 0 to MchnCnt - 1 do
begin
AItem := CblCrns.Items[MchnIdx];
if AItem^.Active
and (not AItem^.B_Using)
and (CblCrns.CanActInBrk(AItem.BrkInfo, 0))
then begin
SetLength(AMtch^.Altns[ArrIdx].Strips, 1);
//FastMM报上面这句造成了内存漏洞(A memory block has been leaked. The size is: 436)

AMtch^.Altns[ArrIdx].Strips[0].MchnID := AItem^.ObjID;
AMtch^.Altns[ArrIdx].MachEquiped := True;
AvailCnt := AvailCnt + 1;
Break;
end;
end;
end;
end;

Result := AvailCnt;
SetLength(IdxArr, 0);
end;

//内存释放部分
procedure CPrepMatches.FreeCmplxVar(ItmIdx : Integer; ItmOrBak : Boolean = True); //复杂对象的内存释放
var
AMtch : PSMatch;
Idx : Integer;
begin
if ItmOrBak then AMtch := Items[ItmIdx]
else AMtch := SavedItems[ItmIdx];

for Idx := 0 to High(AMtch^.Altns) do
SetLength(AMtch^.Altns[Idx].Strips, 0);

SetLength(AMtch^.Altns, 0);
end;
...全文
121 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hapland 2015-01-24
  • 打赏
  • 举报
回复
我已经找到原因: 是因为上面的结构体中动态数组 复制的时候造成的内存漏洞 利用Move函数复制内存,会将动态数组的指针复制, 而不是创建动态数组的副本

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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