Методи перевірки витоку пам'яті в програмі

Методи перевірки витоку пам'яті в програмі

Підкажіть, як ви перевіряєте, чи є витік пам'яті в програмі чи ні. Начебто для цього спеціальні компоненти є?

FastMM4, MemProof, # XA0; AQTime

Ось підкажіть. Виявив, що виклик даної функції в циклі призводить до витоку пам'яті. Чому?

TMyRec = record
# XA0; MStr: String;
# XA0; UStr: String;
# XA0; ID: Integer;
end;

function GetMR: TMyRec;
begin
ZeroMemory (@Result, SizeOf (Result));

Result.MStr: = "Text";
Result.UStr: = "Text";
Result.ID: = 1;
end;

При другому і наступних входах Result містить попередні дані.
Щоб їх очистити я виконую ZeroMemory (@Result, SizeOf (Result));
Але виявив, що якщо цю процедуру прибрати, то витоку пам'яті не буде.
Чому? І як правильно в даному випадку очищати Result?


> # XA0; Виявив, що виклик даної функції в циклі призводить до
> Витоку пам'яті.

а як ти виявив?

а якщо не String, а ShortString використовувати, витоку спостерігатимуться?

Відкриваю Менеджер завдань Windows і дивлюся на пам'ять, яка витрачається. Якщо прибрати рядок ZeroMemory, то використовувана пам'ять перестає збільшуватися.


> Відкриваю Менеджер завдань Windows і дивлюся на пам'ять, яка
> витрачається

Стовпець який дивишся? Там не будь-який стовпець відображає реально займану пам'ять.
Витік у тебе виникає тому що не треба робити довгим рядкам ZeroMemory

Дивлюся "Пам'ять" після "ЦП".
Так, точно, якщо зробити наприклад String [250], то пам'ять залишається незмінною. Я забув, що рядки це теж дин. масиви.

За жалюгідних Baks * 99


> Baks # XA0; (31.01.11 3:07) [11]
>
> За жалюгідних Baks * 99
>

Тобі може і за "жалюгідних". А нам спокійніше.
А тобі цілком реальна допомога (техпідтримка) від вельми реальних людей.
До речі вельми шанованих на се форумі. (Та й на інших відомих російськомовних форумах по Дельфі).

P.S. Про "жалюгідних $ 99". Скільки ти в місяць витрачаєш на свій мобільник?

P.P.S. Або я тебе неправильно зрозумів?


> # XA0; Або я тебе неправильно зрозумів?


> Скільки ти в місяць витрачаєш на свій мобільник?

FastMM4 просить SHFolder.dcu. Де його взяти? Де він повинен бути? У мене Delphi 5.

Baks # XA0; (30.01.11 19:54)
MStr: String;
стринги низя ZeroMemory, стринга це покажчик.
а ти зніми робиш ось це:
procedure TForm1.Button1Click (Sender: TObject);
var
# XA0; i: integer;
# XA0; p: pointer;
begin
# XA0; for i: = 0 to 10 do
# XA0; begin
# XA0; # XA0; GetMem (p, 1048576);
# XA0; # XA0; p: = 0;
# XA0; # XA0; FreeMem (p);
# XA0; end;
end;

Пацієнт п'єте? немає
Пацієнт курите? немає
З бабами гуляєте? немає

Доктор: пацієнт не чиніть опір, я все одно що ні будь знайду.


> Стринги низя ZeroMemory

Так я вже зрозумів. Я просто рвав свої стринги :)


> Пацієнт не чиніть опір, я все одно що ні будь знайду

А я ось що ще хочу запитати:

Підключив FastMM, отримав:

У цьому додатку відбуваються витоку пам'яті. Витоку блоків маленького розміру (виключаючи очікувані витоку зареєстровані за вказівником): 37 - 52 байт: AnsiString x 1

Це відбувалося через наступний коду:

initialization
# XA0; AppPath: = ExtractFilePath (ParamStr (0));
# XA0; FilesPath: = AppPath + FilesDirName + "";

Більше повідомлення про витік виводяться. Чи правильно я зробив?
І ще питання: чому нічого не повідомляється про змінну FilesPath?


> Baks # XA0; (30.01.11 19:54)
>
> Підкажіть, як ви перевіряєте, чи є витік пам'яті в програмі
> Чи ні. Начебто для цього спеціальні компоненти є?

begin
# XA0; writeln (ParamStr (1));
end.

і запускаємо

for %% n in (F: \ mypath \ *. ent) do a.exe %% n

У taskmgr бачимо, що пам'ять тече. Кудись.

a.exe "F: \ mypath \ file1.ent"
a.exe "F: \ mypath \ file2.ent"
a.exe "F: \ mypath \ file3.ent"
a.exe "F: \ mypath \ file4.ent"
.

Я ось з FastMM розбирався колись, ніби все актуально, сам іноді користуюся, якщо забуду що

Я до речі обидві ці статті вже недавно читав, через google знаходив.

Схожі статті