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

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

Освобождение памяти [D6]


Страницы:   1 2 3

SashaK ©   (2002-08-13 14:05:00) 

У меня есть массив из записей (Record). Запись имеет строковые поля. Когда я присваиваю в строковое поле значение, очевидно, выделяется память и туда пишется строка. Будет ли при удалении массива освобождаться память, выделенная под строки ?


app   (2002-08-13 19:46:00) [1]

Если будете препираться, то ветка отправится не в Потрепаться, а в корзину. Для выяснения личных неприязней пожалуйте в чат.

комодератор


esu   (2002-08-13 19:26:00) [2]

Как-то неправильно это все. Да и лишний раз память освободить никогда лишним небыло :)

"Главное, что бы человек был хороший" (с)


kull   (2002-08-13 18:55:00) [3]

Вообще пора этой ветке в "потрепаться" отправится. :)


kull   (2002-08-13 18:53:00) [4]


> DiamondShark © (13.08.02 18:49)

Вах... Да вы шютыник...


kull   (2002-08-13 18:50:00) [5]


> Даже если бы Borland и не генерировал на самом деле в упомянутом
> контексте тот самый код, думаю, это вовсе не означало бы
> наличие явного или неявного бага.

Ну если б был баг, то это баг от Borland.

Но сама концепция ( теоретически, не смотря ни на баги, ни на генерируемый код, т.к. это не важно в данном случае) такова, что строки типа stringосвобождаются сами.
Так в чем же еще загвоздка?
Неужели вы пишете программы, основываясь на возможных багах компилятора?


DiamondShark   (2002-08-13 18:49:00) [6]


> Digitman © (13.08.02 18:39)
>
> А код Ваш (цитирую)
>
> TRec = record
> S: DWORD;
> end;
>
> и писать
>
> string(Rec.S) := "sljkdflsjdlfjk";
>
> без явной инициализации поля Rec.S дает отказ.


Согласен. Совершенно не рабочий код. При компиляции на строке "и писать" выдается ошибка

[Error] Unit1.pas(123); Illegal character in input file: "и" ($E8)


kull   (2002-08-13 18:43:00) [7]

Да никаких Finalize не надо.
Сами, сами строки освобождаются! >:(


Digitman   (2002-08-13 18:39:00) [8]

>kull
>>Вот как ты можешь доверять Borland...

Даже если бы Borland и не генерировал на самом деле в упомянутом контексте тот самый код, думаю, это вовсе не означало бы наличие явного или неявного бага.

>DiamondShark
Как угодно. На "Вы" - значит, на "Вы". Ваше право, сударь.

А код Ваш (цитирую)


TRec = record
S: DWORD;
end;

и писать

string(Rec.S) := "sljkdflsjdlfjk";



без явной инициализации поля Rec.S дает отказ.
Или будьте предельно точными в высказываниях, подчеркнув предварительно этот факт, коль скоро Вы подчеркиваете свои твердые знания по сабжу.

Так что - будьте так любезны - следите, сударь, за собой, а не за мной - я уж как-нибудь сам справлюсь со своими "отказами".


DiamondShark   (2002-08-13 18:34:00) [9]


> SashaK (13.08.02 18:27)
> Прошу прощения, не мог участвовать в форуме.


Вы не много потеряли ;)


> Освобождаю память через FreeMem. Насколько я понял, это
> приведет к утечке памяти, поэтому освобождать строку нужно
> руками.


Да. Используя Finalize сразу для всего массива
см. DiamondShark © (13.08.02 17:00)


Skier   (2002-08-13 18:30:00) [10]

>SashaK
Освобождай через Dispose и будут тебе счастье... :)


SashaK   (2002-08-13 18:27:00) [11]

Прошу прощения, не мог участвовать в форуме.
Освобождаю память через FreeMem. Насколько я понял, это приведет к утечке памяти, поэтому освобождать строку нужно руками.


kull   (2002-08-13 18:17:00) [12]

Да ладно, народ, вы че?
Миру - мир!


DiamondShark   (2002-08-13 18:14:00) [13]


> Digitman © (13.08.02 17:59)


Смею заметить, что отстаивание мнений (каких бы то ни было) не является основной целью выступления здесь. Основная цель -- корректный ответ на поставленный вопрос, и рекомендации к действиям, что было незамедлительно представлено DiamondShark © (13.08.02 17:00)(не в пример тебе).

Это учтите, сударь. На будущее.

PS
А на брудершафт мы, помнится, не пили. Так что в будущих дискуссиях, пожалуйста, на "вы".


kull   (2002-08-13 18:12:00) [14]


> Digitman © (13.08.02 17:59)

Вот как ты можешь доверять Borland, после твоего же заявления, о том, что он не освобождает память после использования строк.


> Смею заметить, что я не отстаиваю "до упора" ошибочное мнение,
> каким бы устойчивым оно ни было до момента Х. И всегда готов
> публично признать свою ошибку, если она действительно имеет
> место быть. Тем более - как результат серьезных и детальных
> контраргументов, каковые и представил незамедлительно уважаемый
> <Ученик> (не в пример тебе). И это - абсолютно нормально.
> Истина рождается только так.

Да ладно-ладно, ну промах допустил, ну с кем не бывает. Зачем оправдываться?
К чему речи одетальных контраргументах?
И на солнце бывают пятна!

Просто даже без детального разбора кода, ясно, что было бы смешно, если бы память не освобождалась там где она автоматически выделялась.


Digitman   (2002-08-13 17:59:00) [15]

>kull

>>Ну это ты зря ...
Позволь уж мне самому судить, зря или не зря, ok ?

>DiamondShark

Смею заметить, что я не отстаиваю "до упора" ошибочное мнение, каким бы устойчивым оно ни было до момента Х. И всегда готов публично признать свою ошибку, если она действительно имеет место быть. Тем более - как результат серьезных и детальных контраргументов, каковые и представил незамедлительно уважаемый <Ученик> (не в пример тебе). И это - абсолютно нормально. Истина рождается только так.

P.S.
Твои "доводы" я тоже учту, сударь. На будущее. При потенциально возможных дискуссиях с твоим участием.


DiamondShark   (2002-08-13 17:39:00) [16]


> DiamondShark © (13.08.02 17:16)


Мои извинения. Действительно очень грубо.


> kull © (13.08.02 17:21)


1000000 -- слишком много. Дельфевый менеджер отбирает у системы минимум по 1 странице (4к байт) за раз.
Строки обычно короткие (к примеру на этой странице в строке умещается примерно 100 символов), так что иногда тестируя программу на приближенных к реальным даннах даже за несколько итераций не обнаружить утечку.

Конечно, на экстремальных тестах все сразу заметно.


kull   (2002-08-13 17:39:00) [17]


> Ученик © (13.08.02 17:22)

Выходит дед из немецкого штаба:
"Да, с коровой нае...али, да и с партизанами как-то некрасиво получилось..."


Ученик   (2002-08-13 17:22:00) [18]

>DiamondShark © (13.08.02 17:16)

Зря Вы так, грубо это


kull   (2002-08-13 17:21:00) [19]


> Все то, что я знаю (если я чего-то знаю), дает мне "чистый"
> вообще и машкод в окне CPU в частности. Никакими сторонними
> средствами я никогда не пользовался, не пользуюсь и пользоваться
> не намерен - доверяю только Борланду и своей голове.

Ну это ты зря - система то от Microsoft, так что это не стороннее средство...
И потом зачем расчитывать окружающую температуру по сложным формулам, когда есть термометр.


> Системный монитор -- плохой помошник.
>
> Менеджер памяти Дельфи выделяет большой непрерывный кусок
> для кучи и уже в нем сам себе на уме распределяет строки
> и объекты.

Я привык доверять не только борланду но и своим глазам.
В примере я выделил память для строки длинной 1000000.
Так вот с dispose монитор ничего не показал, а без dispose - видно, что память жрется. Ну и причем дельфовский менеджер?

Да даже если память выделяется блоками - никакой утечки все равно нет.


DiamondShark   (2002-08-13 17:16:00) [20]


> Digitman © (13.08.02 17:08)


А еще в старом варианте можно предложить заменить описание

TRec = record
S: DWORD;
end;

и писать

string(Rec.S) := "sljkdflsjdlfjk";

Тоже гарантированная утечка ;)

А еще можно просто предложить на фиг убрать Dispose. И радостно так зубоскалить: "Утечка! Утечка!"

Зачем передергивать и примысливать ? ИМХО не достойно звания мастера. Сели в лужу, так обтекайте молча.


Страницы:   1 2 3

Наверх

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