| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Не обнуляется переменная |
| Автор: Rexar 25.4.2008, 20:53 |
| procedure perem; var i: integer; begin ShowMessage(IntToStr(i)); end; Выводит какое-то значение ! Т.е. создаётся непустая переменная. Кто знает почему, и как с эти бороться ! P.s. - обнулять по типу i := 0 тупо и неразумно; А если у меня ТИП данных, где 100 таких переменных, мне что их все по очереди обнулять ? Проверял на Delphi 7 и Delphi 2005 ! Может надо где-то что-то прописать чтобы заработало ? |
| Автор: volvo877 25.4.2008, 21:05 |
Встречный вопрос: а с чего ты решил, что она ДОЛЖНА обнуляться? Обнуляются глобальные переменные, а у тебя локальная, в стеке, там будет мусор... |
| Автор: Qu1nt 25.4.2008, 21:05 | ||
Вот такие они, локальные переменные, RTFM.
FillChar. |
| Автор: Rexar 25.4.2008, 21:10 | ||
И как тут быть ? |
| Автор: volvo877 25.4.2008, 21:17 |
| Опиши не как Record, а как Class, поля класса при его создании обнулятся... |
| Автор: Qu1nt 25.4.2008, 21:21 | ||
Либо:
|
| Автор: Rexar 25.4.2008, 21:45 | ||
А если запись будет содержать вложенные записи, то тоже будет работать ? В данном примере вызов процедуры FillChar проинициализирует строки пустыми значениями, такой подход был нормальным в ранних версиях Delphi и Borland Pascal, но недопустим в последних версиях, в которых тип string по умолчанию соответствует типу LongString и суть указатель. Если значения строк перед инициализацией были не пусты, то мы получим утечку памяти. Как вы это прокомментируете ? |
| Автор: aktuba 26.4.2008, 04:09 |
Что тут комментировать то? Компилятор не может предсказать все твои действия, а если самому лень или не хватает ума - это твои проблемы. Надоедает, когда пишут такой бред, ощущение, что в программисты идут с мыслью, что стоит только компилятору сказать, что тебе надо - все будет готово. |
| Автор: Rexar 26.4.2008, 15:53 | ||
Во первых я - металлург ! И не надо возгласов "Оно и видно" ! И вобще-то я ищу рациональное решение ! И я предположил, что возможно в компиляторе это настраивается, т.к. по сути обнуление переменных надо далеко не всегда необходимо и поэтому обнуление всех переменных будет уменьшать скорость работы программы, поэтому я думаю что создатели делфи и не сделали обнуление включенным параметром ! И вобще я просил прокомментировать предыдущую цитату, т.к. я не совсем ясно понимаю её смысл ! Как именно я получу утечку памяти ? |
| Автор: volvo877 26.4.2008, 16:09 |
| Это не повод для того, чтобы читать ответы, данные тебе ВЫБОРОЧНО... Вариант с классами тебя чем не устроил, можно полюбопытствовать? Ну, возможно, ты и знаешь, что это цитата, но здесь, прости, не форум телепатов. Если хочешь, чтоб об этом узнали и другие, можно было выделить цитату специальным тегом (хинт, посмотри слева от редактора есть такие круглые кнопочки, что на верхней написано?), и дать ссылку, ОТКУДА эта цитата выдрана. |
| Автор: aktuba 26.4.2008, 16:48 |
Очень просто. Ты обнулишь указатели на строки, но сами строки останутся висеть в памяти. Вообще, хорошая традиция, всегда в ручную обнулять переменные. |
| Автор: Rexar 26.4.2008, 20:23 | ||||||
Т.е. будет постоянно увеличиваться потребляемая программой память ?
Ок, учту !
Т.е. при создании класса TProtocol будут обнуляться переменные во всех record, которые описаны в этом классе ? |
| Автор: VICTAR 26.4.2008, 20:33 | ||
Вообще, если речь идет конкретно о строках
|
| Автор: Rexar 27.4.2008, 02:23 | ||||
А если я обнуляю внутри функции, то при выходе из функции строки уберуться из памяти ? |