| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Управление памятью |
| Автор: rainbow86 5.3.2006, 13:34 | ||
Можно ли так писать, ведь как я понимаю по выходе из функции все локальные перемменые созданные в ней должны уничтожаться, а мы пытаемся возвратить указатель на переменную? На что будет указывать возвращаемый указатель? Что будет с памятью на которую указывает указатель после отработки функции? Заранее спасибо! |
| Автор: MAKCim 5.3.2006, 13:44 | ||
| у тебя v ни на что не указывает изначально, память нигде не выделяется (судя по коду), функция возвратит 0 если бы мы выделяли память в ф-ии то она возвращала бы копию переменной v, которая бы содержала адрес первого байта выделенной памяти, сам указатель в ф-ии уничтожается (т. к в стеке)
|
| Автор: Гоганчик 5.3.2006, 13:54 | ||
По моему все зависит от реализации компилятора. У меня, например, следующий код
Обработался корректно, т.е. в функции main имеются права не только на чтение, но и на запись по указателю u. Все работает и даже очень хорошо. Я использовал gcc 4.0, и операционную систему Fedora Core 4 |
| Автор: DeadSoul 5.3.2006, 14:03 |
| Гоганчик, за такой код надо отрывать руки. Тебе просто повезло. rainbow86, какой смысл возврата указателя? Ты хочешь вернуть строку? Тогда лучше используй std::string |
| Автор: BreakPointMAN 5.3.2006, 14:15 |
| Гоганчик, а ты литературу по C++ читать пробовал? Переменная a типа char в твоей функции a является локальной для этой функции, время ее жизни - от точки объявления до конца блока, являющегося телом функции. Переменная создается на стеке и, после отработки функции, уничтожается. Ты же определяешь указатель x типа char*, с помощью операции "&" (операции взятия адреса) заставляешь x ссылаться на адрес, по которому хранится переменная a, и возвращаешь этот адрес в свою главную функцию main. Указатель u типа char* инициализируется адресом, возвращенным функцией a, но по этому адресу в данный момент уже нельзя обращаться, ибо переменная a (локальная переменная для функции a была уничтожена после выхода из функции). Ты же пытаешься разыменовать этот указатель, вывести то, что хранится по этому адресу, и, что еще хуже, изменить это. Если у тебя ничего при этом не заглючило, и никаких Access Violation не было, то это просто чистая случайность и удача... |
| Автор: rainbow86 5.3.2006, 14:55 | ||
При выделении памяти с помощью malloc или new понятно надо использовать или free или delete. Но если мы не используем эти опреторы а инициализируем указатель например так : char *str="bldfg"; Надо ли заботится об освобождении памяти, после того как функция отработала? |
| Автор: np9mi7 5.3.2006, 15:33 | ||
|
| Автор: BreakPointMAN 5.3.2006, 15:36 | ||
Не надо. Указатель str типа char* в данном случае "настраивается" на строковую константу "bldfg", расположенную... гммм... в сегменте данных... ты просто берешь адрес начала строки и записываешь в указатель... память под нее уже выделена... delete и free нужно вызывать только при динамическом выделении памяти. |
| Автор: MAKCim 5.3.2006, 17:55 | ||
нет |
| Автор: BreakPointMAN 5.3.2006, 18:44 |
| MAKCim, посты набираешь? Зачем отвечать на вопрос, на который уже дан ответ двумя участниками форума? И ладно бы, твой ответ дополнял или поправлял уже данные ответы... |