Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Управление памятью


Автор: rainbow86 5.3.2006, 13:34
smile

Код


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

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

     retrun v;
}



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

Заранее спасибо!

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

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

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

Автор: Гоганчик 5.3.2006, 13:54
По моему все зависит от реализации компилятора. У меня, например, следующий код
Код

#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

Автор: 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 не было, то это просто чистая случайность и удача...

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

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

Автор: rainbow86 5.3.2006, 14:55

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


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

char *str="bldfg";

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

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

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

char *str="bldfg";

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


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

Автор: MAKCim 5.3.2006, 17:55
Цитата

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

нет

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)