Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.66 MB
Время: 0.083 c
4-1098793495
sapsi
2004-10-26 16:24
2004.12.12
Переключение Alt+Tab


3-1100407007
Black
2004-11-14 07:36
2004.12.12
Ошибка при попытке изменения свойства ADOConnection


3-1100015950
Kergma
2004-11-09 18:59
2004.12.12
Добавить, получить значение поля массива......КАК?


14-1101223336
ОлегЪ
2004-11-23 18:22
2004.12.12
Дизайн


14-1101283486
PVOzerski
2004-11-24 11:04
2004.12.12
USB-принтер с NT4 - возможно ли?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский