![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос мастерам Как объяснить следующие утечки памяти ? [D7]
Кто---то © (2004-11-28 01:48:00)
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 ? Чем объясняются эти цифры и почему ФриМем не освобождает правильно память ?
KSergey (2004-11-29 11:28:00) [1]> [22] Суслик © (29.11.04 11:21)
> нет, автору.
;)
Ну вот кончится RO - может и узнаем ;)
Суслик (2004-11-29 11:21:00) [2]
> [21] KSergey © (29.11.04 11:20)
нет, автору.
Просто ты обратил внимание на то, что автор упомянул кучу.
Прошу прощения за введение в недопонимание...
KSergey (2004-11-29 11:20:00) [3]> [20] Суслик © (29.11.04 11:16)
Это мне?
Суслик (2004-11-29 11:16:00) [4]куча то тут при чем :)))
KSergey (2004-11-29 11:16:00) [5]> [13] Кто---то © (29.11.04 01:58)
> Из кучи. getHeapStatus и TotalAllocated в нём.
> Если произошло изменение, значит где-то утечка памяти.
А почему "если произошло изменение - то утечка"? Утечка - если память заняли и не отдали... Или я что-то недопонимаю?
Ega23 (2004-11-29 11:06:00) [6]А зачем всё так сложно? Неужели PChar было недостаточно?????
Суслик (2004-11-29 11:02:00) [7]поддерживаю
panov (2004-11-29 03:27:00) [8]>Кто---то ©
3 дня РО за хамство в качестве предупреждения.
Кто---то (2004-11-29 03:07:00) [9]
> Германн © (29.11.04 02:28) [14]
> Надеюсь термин "куча" тебе известен из литературы по паскалю
> Мне тебя жаль.
По-моему вам надо жалеть себя, раз вы не смогли заметить мой расказ о куче в идущем перед вашем постинге.
> Как видишь, я могу перевести с аглицкого на русский
Типа хотите, чтобы мы вам поапплодировать за это всем форумом ? И восхитились как вы круто переводите с англиского ?
> тебе лучше сменить область деятельности
А вам лучше не давать идиотских советов. Пока вам в ответ не посоветовали отправляться на нечто мужское.
Германн (2004-11-29 02:28:00) [10]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 01:58:00) [11]
> Германн © (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-28 14:05:00) [12]Автору
> finalize(a1.myarray, cnt1)
вернее так
finalize(a1.myarray[0], cnt1)
соответвенно и initialize также делай.
Суслик (2004-11-28 14:00:00) [13]
> [6] Германн © (28.11.04 03:38)
Извини, старичок, не до конца был поняты твои слова:))
Ты прав.
Суслик (2004-11-28 13:59:00) [14]Автору.
Если есть желание так извращаться, то обязательно читай про функции initialize и finalize.
Тебе обязательно нужно делать initilize. Сразу после AllocMem. То, что у тебя пока нет access violation, так это тебе везука :)))
Суслик (2004-11-28 13:57:00) [15]
> А теперь учти: переменная a1 : TObj3 содержит long string
> Name2 и для Name2 естественно будет вызван метод Finalize.
>
Глупости.
при использовании getmem, freemem, allocmem никаких finalize никогда не используется.
Суслик (2004-11-28 13:55:00) [16]перед freemem
finalize(a1.myarray, cnt1)
KSergey (2004-11-28 13:50:00) [17]> Кто---то © (28.11.04 01:48)
И все же совершенно не понятно зачем объявлять статический массив, а потом хрен поймешь как под него выделять память?? Может тогда объявить динамический и работать с ним штатными средствами?
И еще. А как определяютяс эти "утечки памяти"? откуда такой вывод?
Германн (2004-11-28 03:38:00) [18]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 ну очень опосредственно. Как некий указатель на что-то!
Кто---то (2004-11-28 02:28:00) [19]
> Германн © (28.11.04 02:07) [3]
> Во-первых учти выравнивание.
А вы сами-то знаете как именно "учесть" ? Если знаете, то объясните ?
> FreeMem тут не годится
Для Name2 годится а для Name1 нет. Хотя конечно, не сработало - значит негодится. Как бы мы только жили без таких ценных советов ?
Кто---то (2004-11-28 02:16:00) [20]
> Sirakuz (28.11.04 01:59) [1]
> Не понимаю, зачем ты тут динамически выделяешь память, у
> тебя же массив статический.
Когда нечего ответить начинаются вопросы не в тему.
Вам весь юнит сюда запостить, на 200 килобайт ничего не вырезая ?