Delphi/FPC: утекает память в IntToHex
а fastmm из 2k7 что говорит?
названия обнадёживающие. как этим FastMM пользоваться?
кроме того, у этого fastmm есть такой прикол, что он может память явно (т.е. через virtualfree) не освобождать сразу после вызова деструктора \ freemem-а. а может как-то ее по-хитрому кэшировать. у меня была такая ситуация: в многопоточном приложении в подгружаемой DLL выделялось в нескольких потоках по двумерному массиву по 400 мегабайт каждый (потом с массивами была работа НО при освобождении массивов прога память не освобождала и диспетчер памяти показывал, что прога выделила сотни мегабайт.
з.ы. переходи на D2007
Оборачиваете все в цикл и повторяете 100-10000 раз. У меня количество памяти при этом не возрастает - а значит утечки нет. Если вас интересует почему разница не в 400 байт - так не забывайте про структуры кучи, выравнивание в ней, резерв массива и.т.д.
сделай не циклом, а линейный участок на 100 таких действий. тебя кое-что удивит
делаем так:
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
WriteLn(IntToHex(Integer(Pointer(a8;
Если брать FastMM, то FastGetHEapStatus тоже показывает увеличение TotalAllocated на каждый вызов IntToHex на 20байт.
Цикл такого эффекта не даёт. независимо от длины цикла утекает ровно 20 байт.
если в цикле два раза IntToHex, то утечёт 40.
однако после завершения работы Fast отчёта не даёт.
Я уже не говорю о том, что исходники IntToHex можно и посмотреть. В FPC 2.2.0 и 2.2.1 она выглядит так:
{ IntToHex returns a string representing the hexadecimal value of Value }
const
Heigits: array[0..15] of char = '0123456789ABCDEF';
function IntToHex(Value: integer; Digits: integer): string;
var i: integer;
begin
SetLength(result, digits);
for i := 0 to digits - 1 do
begin
result[digits - i] := Heigits[value and 15];
value := value shr 4;
end ;
while value <> 0 do begin
result := Heigits[value and 15] + result;
value := value shr 4;
end;
end ;
Я уже не говорю о том, что исходники IntToHex можно и посмотреть.В D7 она реализована на асме.
Кстати, интересно вот что: под D6 такой-же эффект тоже сохранялся?
А асм надо знать!
lea eсx, [ebp-$04]
вот это что означает?
такая инструкция предшествует непосредственно запихиванию аргументов в регистры и вызову IntToHex
ecx=ebp-4 всего лишь
ecx=ebp-4 всего лишьпо-моему, скобочки [ebp-4] означают взятие содержимого по адресу ebp-4
а lea по-твоему что означает?
ecx = &*(ebp-4)
Короче, нечего бить тревогу: никаких утечек здесь нет и быть не может.
ps: у меня D7, если что..
pps: и чем это я на работе занимаюсь?
если fastmm не ругается (при учете включенной проверки на leakи значит все в порядке.
Добро пожаловать в мир подсчёта ссылок, Вася
Ну я-то и так все на java пишу, используя паскаль и асм только для задач (в основном переборных где нужна максимальная производительность.
Оставить комментарий
yolki
проверено на D7/D2007 (утекает 20 байт на вызов)проверено в FPC 2.2.0 (утекает 16 байт на вызов)
Кто-нибудь может что-то прокомментировать?