В общем решается эта задача только ручками. Я написал простенький модуль с которым может разобраться даже студент. Идея состоит в том чтобы найти в дебаг коде место выделения теряемой памяти. То есть сделать точку останова, а дальше по окну стека вызовов или шажками дебага найти место и понять какая переменная была потеряна.
[more=Вот код]
Код: [no]unit FixMMgr;
interface
implementation
const
FStack = $12FC90;
FSize = 32;
var
SaveMemMgr: TMemoryManagerEx;
MMem: array[0..500000] of packed record
Data, St: Pointer; Size: Integer;
end;
MCnt: Integer = 0;
procedure FindedProc;
begin //<-break point
//System.Error(reControlBreak);
end;
function GetMIdx(P: Pointer): Integer;
begin
for Result := Low(MMem) to High(MMem)-1 do
begin
if MMem[Result].Data = P then Exit;
end;
System.Error(reInvalidPtr);
end;
function MyReallocMem(P: Pointer; Size: Integer): Pointer;
var
I: Integer;
begin
Result := SaveMemMgr.ReallocMem(P, Size);
I := GetMIdx(P);
MMem[I].Data := Result;
// if (MMem[I].St=Pointer(FStack)) and (Size=FSize) then
// FindedProc;
MMem[I].Size := Size;
end;
{$region ' [get free, init] '}
function MyGetMem(Size: Integer): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.GetMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;
function MyAllocMem(Size: Cardinal): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.AllocMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;
function MyFreeMem(P: Pointer): Integer;
var
I: Integer;
begin
I := GetMIdx(P);
Move(MMem[I+1], MMem[I], (MCnt-I)*SizeOf(MMem[0]));
Dec(MCnt);
Result := SaveMemMgr.FreeMem(P);
end;
procedure InitMyMemMgr;
var
MemMgr: TMemoryManagerEx;
begin
FillChar(MMem, SizeOf(MMem), 0);
GetMemoryManager(SaveMemMgr);
MemMgr := SaveMemMgr;
MemMgr.GetMem := MyGetMem;
MemMgr.AllocMem := MyAllocMem;
MemMgr.FreeMem := MyFreeMem;
MemMgr.ReallocMem := MyReallocMem;
SetMemoryManager(MemMgr);
ReportMemoryLeaksOnShutdown := True;
end;
{$endregion}
initialization
InitMyMemMgr;
finalization
SetMemoryManager(SaveMemMgr); //<-break point
end.
[/no]
[more=Вот код]
Код: [no]unit FixMMgr;
interface
implementation
const
FStack = $12FC90;
FSize = 32;
var
SaveMemMgr: TMemoryManagerEx;
MMem: array[0..500000] of packed record
Data, St: Pointer; Size: Integer;
end;
MCnt: Integer = 0;
procedure FindedProc;
begin //<-break point
//System.Error(reControlBreak);
end;
function GetMIdx(P: Pointer): Integer;
begin
for Result := Low(MMem) to High(MMem)-1 do
begin
if MMem[Result].Data = P then Exit;
end;
System.Error(reInvalidPtr);
end;
function MyReallocMem(P: Pointer; Size: Integer): Pointer;
var
I: Integer;
begin
Result := SaveMemMgr.ReallocMem(P, Size);
I := GetMIdx(P);
MMem[I].Data := Result;
// if (MMem[I].St=Pointer(FStack)) and (Size=FSize) then
// FindedProc;
MMem[I].Size := Size;
end;
{$region ' [get free, init] '}
function MyGetMem(Size: Integer): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.GetMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;
function MyAllocMem(Size: Cardinal): Pointer;
var
P2: Pointer;
begin
P2 := @P2;
Result := SaveMemMgr.AllocMem(Size);
MMem[MCnt].Data := Result;
MMem[MCnt].St := P2;
MMem[MCnt].Size := Size;
Inc(MCnt);
if (P2=Pointer(FStack)) and (Size=FSize) then
FindedProc;
end;
function MyFreeMem(P: Pointer): Integer;
var
I: Integer;
begin
I := GetMIdx(P);
Move(MMem[I+1], MMem[I], (MCnt-I)*SizeOf(MMem[0]));
Dec(MCnt);
Result := SaveMemMgr.FreeMem(P);
end;
procedure InitMyMemMgr;
var
MemMgr: TMemoryManagerEx;
begin
FillChar(MMem, SizeOf(MMem), 0);
GetMemoryManager(SaveMemMgr);
MemMgr := SaveMemMgr;
MemMgr.GetMem := MyGetMem;
MemMgr.AllocMem := MyAllocMem;
MemMgr.FreeMem := MyFreeMem;
MemMgr.ReallocMem := MyReallocMem;
SetMemoryManager(MemMgr);
ReportMemoryLeaksOnShutdown := True;
end;
{$endregion}
initialization
InitMyMemMgr;
finalization
SetMemoryManager(SaveMemMgr); //<-break point
end.
[/no]