Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2010, 21:48   #1
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию free и метки

Здравствуйте, господа.

Никак не могу найти ответы на след. вопросы:

1). Для того, чтобы освободить выделенную ранее память, необходимо использовать, например, функцию free. Однако в таком случае я постоянно вижу сначала free (a), после чего a = NULL. Для чего это делается?

2). Многие говорят, что метки использовать надо как можно меньше. Как их тогда заменять в случае, например, если нам надо заново запустить функцию, в которой мы сейчас находимся?

Заранее благодарю за возможные ответы.
YourLastSong вне форума Ответить с цитированием
Старый 29.12.2010, 22:09   #2
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

1) Ну это очищает память от мусора;
2) Ну в случае вызова функции в которой ты находишься. То тут рекурсия в помощь, а если просто выполнить действие которое выше. Используй do{}while()
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 29.12.2010, 22:12   #3
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Так ведь это уже делается при помощи free (a) или я что-то не так понял вообще?

Пример покажи для первого случая, если не сложно.
YourLastSong вне форума Ответить с цитированием
Старый 29.12.2010, 22:17   #4
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Ну допустим мы выделили память под массив размером в 500 чисел.
Код:
int *temp = new int[500];
Это засорило память
вот теперь и чистим
Код:
free(temp)
Понятно?
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Старый 29.12.2010, 22:21   #5
YourLastSong
Пользователь
 
Регистрация: 12.12.2010
Сообщений: 75
По умолчанию

Я про то, зачем после этого надо писать a = NULL вообще.
YourLastSong вне форума Ответить с цитированием
Старый 29.12.2010, 22:24   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

1) после удаления выделенного куска памяти переменную в которой был указатель (всмысле переменная это указатель = в ней записан адрес памяти) обнуляют (= NULL) чтобы показать что в ней нету выделенной памяти. если ты пытаешся выделить память потом в этот указатель ты проверяешь равен ли он NULL если равен то выделяеш ьпамять, если нет то сначало удаляешь старую.. тожесамое при удалении удалят ьможно только то что не = null. NULL это просто адрес памяти = 0. в нем никогда не бывает выделенных блоков памяти

2) Это низкоуровневый стиль программирования.. метки/goto юзают тока на асме по хорошему. Они усложняют понимание кода и увеличивают количество ошибок.. заменять всем чем только сможешь - всяческие break continue return. Все от случая зависит. юзать их можно конечно, но только в целях оптимизации или если без них вобще никак не удается обойтись.
Если заного надо функцию запустить то вызываешь ее же с теми же параметрами(рекурсия), ну либо делаеш ьвсе содержимое функции в какомнить бесконечном цикле и в конце ставишь break если можно уже выходить из этой функции

Последний раз редактировалось UltimaBeaR; 29.12.2010 в 22:29.
UltimaBeaR вне форума Ответить с цитированием
Старый 29.12.2010, 22:25   #7
TranceSmile
Смайлик :)
Форумчанин
 
Аватар для TranceSmile
 
Регистрация: 12.12.2010
Сообщений: 445
По умолчанию

Ну в "а" хранится ссылка на ячейку памяти где было значение free(a) очистило эту ячейку. a=NULL убирает ссылку.
Самый перспективный framework Yii (c)
TranceSmile вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание метки FUNNY_SAM Общие вопросы C/C++ 0 23.12.2009 15:58
ПАСКАЛЬ. Поставить метки mistertvister Помощь студентам 6 30.10.2009 17:09
Не работают метки ИВэТэшка Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.07.2009 22:05
Метки в делфи Neymexa Помощь студентам 1 29.01.2009 16:52