Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление памятью 
:(
    Опции темы
rainbow86
Дата 5.3.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



smile

Код


char * f()
{ 
     char * v=NULL;

     /*....код....*/

     retrun v;
}



Можно ли так писать, ведь как я понимаю по выходе из функции все локальные перемменые созданные в ней должны уничтожаться, а мы пытаемся возвратить указатель на переменную?
На что будет указывать возвращаемый указатель?
Что будет с памятью на которую указывает указатель после отработки функции?

Заранее спасибо!
PM MAIL   Вверх
MAKCim
Дата 5.3.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



у тебя v ни на что не указывает изначально, память нигде не выделяется (судя по коду),
функция возвратит 0
если бы мы выделяли память в ф-ии то она возвращала бы копию переменной v, которая бы содержала адрес первого байта выделенной памяти, сам указатель в ф-ии уничтожается (т. к в стеке)
Код

char* f()
{
    char* v=malloc(sizeof(int));
    
    /*...код....*/

    return v;                //с памятью ничего не случится
}



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Гоганчик
Дата 5.3.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 5.3.2006

Репутация: нет
Всего: нет



По моему все зависит от реализации компилятора. У меня, например, следующий код
Код

#include <iostream>

using namespace std;

char* a ( )
{
        char* x = NULL;
        char a = 'a';
        x = &a;
        return x;
}

int main ()
{
        char* u = a ();
        cout << *u << endl;
        *u = 'x';
        return 0;
}

Обработался корректно, т.е. в функции main имеются права не только на чтение, но и на запись по указателю u. Все работает и даже очень хорошо. Я использовал gcc 4.0, и операционную систему Fedora Core 4
PM MAIL   Вверх
DeadSoul
Дата 5.3.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Гоганчик, за такой код надо отрывать руки. Тебе просто повезло.

rainbow86, какой смысл возврата указателя? Ты хочешь вернуть строку? Тогда лучше используй std::string


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
BreakPointMAN
Дата 5.3.2006, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Гоганчик, а ты литературу по C++ читать пробовал?
Переменная a типа char в твоей функции a является локальной для этой функции, время ее жизни - от точки объявления до конца блока, являющегося телом функции. Переменная создается на стеке и, после отработки функции, уничтожается. Ты же определяешь указатель x типа char*, с помощью операции "&" (операции взятия адреса) заставляешь x ссылаться на адрес, по которому хранится переменная a, и возвращаешь этот адрес в свою главную функцию main.

Указатель u типа char* инициализируется адресом, возвращенным функцией a, но по этому адресу в данный момент уже нельзя обращаться, ибо переменная a (локальная переменная для функции a была уничтожена после выхода из функции).

Ты же пытаешься разыменовать этот указатель, вывести то, что хранится по этому адресу, и, что еще хуже, изменить это.

Если у тебя ничего при этом не заглючило, и никаких Access Violation не было, то это просто чистая случайность и удача...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
DeadSoul
Дата 5.3.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(BreakPointMAN @ 5.3.2006, 14:15 Найти цитируемый пост)
Если у тебя ничего при этом не заглючило, и никаких Access Violation не было, то это просто чистая случайность и удача...

РАботающая программа - частный случай неопределенного поведения. В его коде "неопределенное поведение" в чистом виде


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
rainbow86
Дата 5.3.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 27.10.2005

Репутация: нет
Всего: нет




Цитата(MAKCim @ 5.3.2006, 13:44 Найти цитируемый пост)
если бы мы выделяли память в ф-ии то она возвращала бы копию переменной v, которая бы содержала адрес первого байта выделенной памяти, сам указатель в ф-ии уничтожается (т. к в стеке)


При выделении памяти с помощью malloc или new понятно надо использовать или free или delete. Но если мы не используем эти опреторы а инициализируем указатель например так :

char *str="bldfg";

Надо ли заботится об освобождении памяти, после того как функция отработала?
PM MAIL   Вверх
np9mi7
Дата 5.3.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
char *str="bldfg";
Надо ли заботится об освобождении памяти, после того как функция отработала?
, нет. А смысл?


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
BreakPointMAN
Дата 5.3.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Цитата(rainbow86 @ 5.3.2006, 14:55 Найти цитируемый пост)
Но если мы не используем эти опреторы а инициализируем указатель например так :

char *str="bldfg";

Надо ли заботится об освобождении памяти, после того как функция отработала?


Не надо. Указатель str типа char* в данном случае "настраивается" на строковую константу "bldfg", расположенную... гммм... в сегменте данных... ты просто берешь адрес начала строки и записываешь в указатель... память под нее уже выделена... delete и free нужно вызывать только при динамическом выделении памяти.


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
MAKCim
Дата 5.3.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Надо ли заботится об освобождении памяти, после того как функция отработала?

нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
BreakPointMAN
Дата 5.3.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



MAKCim, посты набираешь? Зачем отвечать на вопрос, на который уже дан ответ двумя участниками форума? И ладно бы, твой ответ дополнял или поправлял уже данные ответы...


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.