![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Освобождение памяти [D6]
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. И радостно так зубоскалить: "Утечка! Утечка!"
Зачем передергивать и примысливать ? ИМХО не достойно звания мастера. Сели в лужу, так обтекайте молча.