Динамические переменные в процедурах

Dmitry Cherevko

Обязательно ли делать освобождение динамических переменных созданных в локальной процедуре или дельфи сам об этом позаботится?
15 ответов

Dmitry Cherevko

Обязательно ли делать освобождение динамических переменных созданных влокальной процедуре или дельфи сам об этом позаботится?
Обязательно. Хотя и есть некоторые исключения типа интерфейсов и динамических массивов.


Dmitry Cherevko

А вообще лучше возьми за правило: Что сам создавал, то сам и уничтожай...Если этим правилом пользоваться, то проблем потом меньше будет... :)


Dmitry Cherevko

Что такое Динамические переменные?Стековые что ли, если так, то они уничтожаются при выходе.


Dmitry Cherevko

Что такое Динамические переменные?Стековые что ли, если так, то они уничтожаются при выходе.
Телепатирую, что Дмитрий спрашивал об объектах, созданных унутре процедур, обычно методом Create. Судя по постановке вопроса, до знаний о работе стёка далеко.


Dmitry Cherevko

Обязательно ли делать освобождение динамических переменных созданных в локальной процедуре или дельфи сам об этом позаботится?
покажи код


Dmitry Cherevko

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


Dmitry Cherevko

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


Dmitry Cherevko

Имелись ввиду действительно переменные которым выделена память GetMem-омНужно ли заниматься их освобождением:- если эти переменные локальные (определены в процедурах);- если эти переменные глобальные;- если эти переменные опеделены внутри класса;- что происходит с переменными при завершении программы;И еще дополнительно, изменятся ли ответы если все это рассматривать в потоке (TThread)
Вот теперь конкретно1. Если больше эта память не нужна, то особождать обязательно, иначе ни в коем случае. Сами переменные чистить не нужно. Да и не возможно освободить не одну переменную программы, они создаются на этапе компиляции и существую все время, кроме стековых переменных, иногда их называют локальными, они прекращают свое существование при выходе из процедуры.2. А это при чем, но правила теже, освобождать когда память больше не нужна. Переменную освободить не возможно, существует до конца жизни программы.3. Внутри класса переменных не бывает, только поля, правило по памяти теже.4. При выходе из программы, не то что переменных, но и самой программы не существет.5. Потоки особый вид, там существует несколько типов переменных, к выше указаных еще есть и переменные потока. Но тебе пока с потоками рано.


Dmitry Cherevko

Почему я задал этот вопрос?Во первых в процессах мой екзешник начал занимать достаточно много памятиВо вторых со временем работы программы занимаемая память увеличиваетсяВ третьих при завершении программы часть памяти не освобождается это видно на следующей вкладке в диспетчере задачОб ответах:Во первых в вопросе о стековых переменных - зачем же освобождать если "они прекращают свое существование при выходе из процедуры"?Во вторых, таки да, освобождаем место занимаемое переменной, но освобождается ли оно если при выполнении программа дала сбой?В третьих, что касается класса - когда освобождается память занимаемая классом, что происходит с теми переменными которые были определены в этом классе - будет ли в дельнейшем использоваться та память которую они (эти переменные) использовали или она (память) навсегда потеряна для системы?В четвертых, при выходе, та память, которая не была освобождена - переходит ли она в распоряжение операционки или нет?И в пятых, так уж получилось, что у меня как раз тот случай с потоками, поэтому я и обратился в форум за советом потому как описано вначале...


Dmitry Cherevko

Почему я задал этот вопрос?Во первых в процессах мой екзешник начал занимать достаточно много памятиВо вторых со временем работы программы занимаемая память увеличиваетсяВ третьих при завершении программы часть памяти не освобождается это видно на следующей вкладке в диспетчере задач
1. какую именно?2. нормальное явление, во первых есть два диспетчера памяти, каждый со своими понятиями когда ее отдавать, а во вторых это не основания уничтожать нужную программе память, просто не используй ее дольше чем надо.3. так у тебя программа не завершается, а это совсем другой вопрос, не имеющий отношения к данному.


Dmitry Cherevko

Во первых в вопросе о стековых переменных - зачем же освобождать если "они прекращают свое существование при выходе из процедуры"?
Вроде речь идет о ? С помощью GetMem выделяют память переменным типа различных указателей. Для начала попробуй выделить память какой-либо такой переменной и потом посмотреть чему равен SizeOf(этой переменной) и объяснить почему он всегда равен 4 а не тому сколько ты памяти выделил. А потом можно подумать о том сколько же памяти автоматом освобождаеся в стеке после того как "они прекращают свое существование"


Dmitry Cherevko

А потом можно подумать о том сколько же памяти автоматом освобождаеся в стеке после того как "они прекращают свое существование"
Нисколько, как был стек определенного размера, так таким и остался.


Dmitry Cherevko

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


Dmitry Cherevko

Указатель стека никак на размер не влияет.


Dmitry Cherevko

getmem это всегда "глобальное" выделение памяти. если эта память не освобождена по freemem, то будет так, как ты описываешь - приложение жрет память.