Методи перевірки витоку пам'яті в програмі
Підкажіть, як ви перевіряєте, чи є витік пам'яті в програмі чи ні. Начебто для цього спеціальні компоненти є?
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 знаходив.