Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос мастерам Как объяснить следующие утечки памяти ? [D7]


Страницы:   1 2

Кто---то ©   (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 килобайт ничего не вырезая ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо