Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизВопрос мастерам Как объяснить следующие утечки памяти ? Найти похожие ветки
← →
Кто---то © (2004-11-28 01:48) [0]
PObj1 = ^TObj1;
TObj1 = record
Name1 : string;
end;
PObj2 = ^TObj2;
TObj2 = array[0..MaxInt shr 4] of TObj1;
TObj3 = record
Name2 : string;
MyArray : PObj2;
end;
...
var
a1 : TObj3;
const
cnt1 = 1;
begin
a1.MyArray := AllocMem(cnt1 * SizeOf(TObj1));
a1.Name2 := "AAAAAAAAA"; // Эта строка утечек не вызывает.
a1.MyArray[0].Name1 := ""; // С этой строкой утечек нет.
a1.MyArray[0].Name1 := "A"; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := "AA"; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := "AAA"; // С этой строкой утечка = 12.
a1.MyArray[0].Name1 := "AAAA"; // С этой строкой утечка = 16.
a1.MyArray[0].Name1 := "AAAAА"; // С этой строкой утечка = 16.
FreeMem(a1.MyArray);
Почему 12 ? Почему 16 ? Чем объясняются эти цифры и почему ФриМем не освобождает правильно память ?
← →
Sirakuz (2004-11-28 01:59) [1]Не понимаю, зачем ты тут динамически выделяешь память, у тебя же массив статический.
← →
Andy BitOff © (2004-11-28 02:05) [2]Это всеравно, что удалять гланды через, то место откуда ноги растут.
← →
Германн © (2004-11-28 02:07) [3]А ты думал, что строка занимает в памяти столько байт, сколько в ней символов?
Во-первых учти выравнивание. (во-первых, по скольку оно существенно как для Huge(Long) строк, так и для паскалевских.
Во-вторых учти, что Huge(Long) строки, помимо самого их содержания, включают в себя и некую другую информацию и FreeMem тут не годится. Почитай Help о Finalize procedure.
← →
Кто---то © (2004-11-28 02:16) [4]
> Sirakuz (28.11.04 01:59) [1]
> Не понимаю, зачем ты тут динамически выделяешь память, у
> тебя же массив статический.
Когда нечего ответить начинаются вопросы не в тему.
Вам весь юнит сюда запостить, на 200 килобайт ничего не вырезая ?
← →
Кто---то © (2004-11-28 02:28) [5]
> Германн © (28.11.04 02:07) [3]
> Во-первых учти выравнивание.
А вы сами-то знаете как именно "учесть" ? Если знаете, то объясните ?
> FreeMem тут не годится
Для Name2 годится а для Name1 нет. Хотя конечно, не сработало - значит негодится. Как бы мы только жили без таких ценных советов ?
← →
Германн © (2004-11-28 03:38) [6]2 Кто---то © (28.11.04 02:28) [5]
>> Германн © (28.11.04 02:07) [3]
>> Во-первых учти выравнивание.
>А вы сами-то знаете как именно "учесть" ? Если знаете, то >объясните ?
Тут нужно просто учесть. Без вопроса как. Все переменные выравниваются на границу слова (если эта опция не отключена). Поэтому:
и a1.MyArray[0].Name1 := "A"; // С этой строкой утечка = 12.
и a1.MyArray[0].Name1 := "AA"; // С этой строкой утечка = 12.
совершенно одинаковы.
>> FreeMem тут не годится
>Для Name2 годится а для Name1 нет. Хотя конечно, не сработало - >значит негодится. Как бы мы только жили без таких ценных >советов ?
Значит не удосужился прочитать, то что я советовал прочитать.
Тогда читаем Help по FreeMem:
procedure FreeMem(var P: Pointer[; Size: Integer]);
Description
FreeMem destroys the variable referenced by P and returns its memory to the heap. If P does not point to memory in the heap, a run-time error occurs. If P points to a structure that includes long strings, variants, dynamic arrays, or interfaces, call Finalize before calling Freemem.
А теперь учти: переменная a1 : TObj3 содержит long string Name2 и для Name2 естественно будет вызван метод Finalize.
Но! Name1 входит в структуру TObj3 ну очень опосредственно. Как некий указатель на что-то!
← →
KSergey © (2004-11-28 13:50) [7]> Кто---то © (28.11.04 01:48)
И все же совершенно не понятно зачем объявлять статический массив, а потом хрен поймешь как под него выделять память?? Может тогда объявить динамический и работать с ним штатными средствами?
И еще. А как определяютяс эти "утечки памяти"? откуда такой вывод?
← →
Суслик © (2004-11-28 13:55) [8]перед freemem
finalize(a1.myarray, cnt1)
← →
Суслик © (2004-11-28 13:57) [9]
> А теперь учти: переменная a1 : TObj3 содержит long string
> Name2 и для Name2 естественно будет вызван метод Finalize.
>
Глупости.
при использовании getmem, freemem, allocmem никаких finalize никогда не используется.
← →
Суслик © (2004-11-28 13:59) [10]Автору.
Если есть желание так извращаться, то обязательно читай про функции initialize и finalize.
Тебе обязательно нужно делать initilize. Сразу после AllocMem. То, что у тебя пока нет access violation, так это тебе везука :)))
← →
Суслик © (2004-11-28 14:00) [11]
> [6] Германн © (28.11.04 03:38)
Извини, старичок, не до конца был поняты твои слова:))
Ты прав.
← →
Суслик © (2004-11-28 14:05) [12]Автору
> finalize(a1.myarray, cnt1)
вернее такfinalize(a1.myarray[0], cnt1)
соответвенно и initialize также делай.
← →
Кто---то © (2004-11-29 01:58) [13]
> Германн © (28.11.04 03:38) [6]
> Тогда читаем Help по FreeMem:
>
> procedure FreeMem(var P: Pointer[; Size: Integer]);
>
> Description
>
> FreeMem destroys the variable referenced by P and returns
> its memory to the heap. If P does not point to memory in
> the heap, a run-time error occurs. If P points to a structure
> that includes long strings, variants, dynamic arrays, or
> interfaces, call Finalize before calling Freemem.
То есть вы не смогли перевести на русский, что там написано ? Бывает.
Если бы хэлп был на китайском, вы бы наверное иероглифы сюда запостили, и сказали бы смотри как всё понятно ...
> Тут нужно просто учесть. Без вопроса как. Все переменные
> выравниваются на границу слова (если эта опция не отключена).
> Поэтому:
> и a1.MyArray[0].Name1 := "A"; // С этой строкой утечка
> = 12.
> и a1.MyArray[0].Name1 := "AA"; // С этой строкой утечка
> = 12.
> совершенно одинаковы.
А строкуa1.MyArray[0].Name1 := "AAA"; // С этой строкой утечка = 12.
чтож вы забыли ? Или у вас слово из трёх байтов состоит ? Или из 12-ти ?
> KSergey © (28.11.04 13:50) [7]
> И еще. А как определяютяс эти "утечки памяти"? откуда такой
> вывод?
Из кучи. getHeapStatus и TotalAllocated в нём.
Если произошло изменение, значит где-то утечка памяти.
> Суслик © (28.11.04 13:59) [10]
> Если есть желание так извращаться, то обязательно читай
> про функции initialize и finalize.
А что именно про них надо знать ? Знаю, что пишут их в конце модуля. Можно чего нибудь содавать в них типа TList и удалять в конце. Или что то ещё ?
> Тебе обязательно нужно делать initilize. Сразу после AllocMem.
> То, что у тебя пока нет access violation, так это тебе везука
> :)))
Почему ? Просто пишу строке := "" и без проблем.
> вернее так
> finalize(a1.myarray[0], cnt1)
>
> соответвенно и initialize также делай.
А для чего это ?
← →
Германн © (2004-11-29 02:28) [14]2 Кто---то © (29.11.04 01:58) [13]
> FreeMem destroys the variable referenced by P and returns
> its memory to the heap. If P does not point to memory in
> the heap, a run-time error occurs. If P points to a structure
> that includes long strings, variants, dynamic arrays, or
> interfaces, call Finalize before calling Freemem.
FreeMem уничтожает переменную, на которую ссылается Р и возвращает занимаемую ей память в кучу. (Надеюсь термин "куча" тебе известен из литературы по паскалю на русском языке). Если Р не указывает на область памяти внутри кучи, то будет вызвана ошибка времени исполнения. Если Р указывает на структуру, которая содержит в себе длинные строки(long string), варианты, динамические массивы или интерфейсы вызовите процедуру Finalize перед вызовом процедуры FreeMem.
Мне тебя жаль. Как видишь, я могу перевести с аглицкого на русский (вот обратный перевод, увы для меня ну очень сложный.) Но если ты не можешь перевести с английского на русский, используя словари, как в бумажном варианте, так и в электронном, то тебе лучше сменить область деятельности. Ибо хелпы на русском, если и появятся, то уже после твоего выхода на пенсию!
← →
Кто---то © (2004-11-29 03:07) [15]
> Германн © (29.11.04 02:28) [14]
> Надеюсь термин "куча" тебе известен из литературы по паскалю
> Мне тебя жаль.
По-моему вам надо жалеть себя, раз вы не смогли заметить мой расказ о куче в идущем перед вашем постинге.
> Как видишь, я могу перевести с аглицкого на русский
Типа хотите, чтобы мы вам поапплодировать за это всем форумом ? И восхитились как вы круто переводите с англиского ?
> тебе лучше сменить область деятельности
А вам лучше не давать идиотских советов. Пока вам в ответ не посоветовали отправляться на нечто мужское.
← →
panov © (2004-11-29 03:27) [16]>Кто---то ©
3 дня РО за хамство в качестве предупреждения.
← →
Суслик © (2004-11-29 11:02) [17]поддерживаю
← →
Ega23 © (2004-11-29 11:06) [18]А зачем всё так сложно? Неужели PChar было недостаточно?????
← →
KSergey © (2004-11-29 11:16) [19]> [13] Кто---то © (29.11.04 01:58)
> Из кучи. getHeapStatus и TotalAllocated в нём.
> Если произошло изменение, значит где-то утечка памяти.
А почему "если произошло изменение - то утечка"? Утечка - если память заняли и не отдали... Или я что-то недопонимаю?
← →
Суслик © (2004-11-29 11:16) [20]куча то тут при чем :)))
← →
KSergey © (2004-11-29 11:20) [21]> [20] Суслик © (29.11.04 11:16)
Это мне?
← →
Суслик © (2004-11-29 11:21) [22]
> [21] KSergey © (29.11.04 11:20)
нет, автору.
Просто ты обратил внимание на то, что автор упомянул кучу.
Прошу прощения за введение в недопонимание...
← →
KSergey © (2004-11-29 11:28) [23]> [22] Суслик © (29.11.04 11:21)
> нет, автору.
;)
Ну вот кончится RO - может и узнаем ;)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c