Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Вопрос мастерам Как объяснить следующие утечки памяти ?   Найти похожие ветки 

 
Кто---то ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.029 c
3-1100522277
lightix
2004-11-15 15:37
2004.12.12
DBF-ФАЙЛЫ.ЧИСТКА И СОЗДАНИЕ УНИКАЛЬНОГО КЛЮЧА


4-1098956217
Cheburek
2004-10-28 13:36
2004.12.12
Как создать виртуальный СD ? Как написать драйвер ?


14-1101227554
Anatoly Podgoretsky
2004-11-23 19:32
2004.12.12
Космический военный лазер


1-1101738973
Гриша
2004-11-29 17:36
2004.12.12
мемо


14-1100851367
truster
2004-11-19 11:02
2004.12.12
Распаковка ZIPа в Far-e