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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2011, 22:30   #1
pilehead
Новичок
Джуниор
 
Регистрация: 08.06.2011
Сообщений: 2
По умолчанию Указатели на выходе функции

Может быь у меня немного ламерский вопрос, но очень ключевой. Суть вот в чём: есть некая функция, работающая с массивами char. И мне нужно получить её результат. Как это сделать правильнее?
Код:
char* GetParam()
{
	char* inifile=new char;
       /*всякие штуки-дрюки*/
	return *inifile;
}
или так
Код:
GetParam(char* inifile)
{
       /*всякие штуки-дрюки*/
}
Не выйдет ли первом случае утечки памяти, если я, не получая на неё указателя и не освобождая памячть после этого, буду просто работать с ней (ну, скажем запихну в качестве аргумента в другую функцию)? Вообще, есть какие-нибудь толковые статейки по этому поводу для наведения порядка в голове?))
pilehead вне форума Ответить с цитированием
Старый 08.06.2011, 22:35   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первый вариант, если не освободите память, то будет утечка.
во втором все сразу на ваших плечах+можно передать указаатель на стековый массив.
мне нравится второй.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.06.2011, 22:50   #3
pilehead
Новичок
Джуниор
 
Регистрация: 08.06.2011
Сообщений: 2
По умолчанию

а вот тоже интересный вопрос: получается нам имеет смысл заморачиваться только для тех указателей, которым мы сделали new? А если например мы завели массив тех char'ов (без new, то есть чисто как char array[50]и работали с ним потом как с указателем, то нам потом не нужно ему делать delete?
pilehead вне форума Ответить с цитированием
Старый 09.06.2011, 08:19   #4
Геральт
Новичок
Джуниор
 
Регистрация: 09.06.2011
Сообщений: 7
По умолчанию

Цитата:
а вот тоже интересный вопрос: получается нам имеет смысл заморачиваться только для тех указателей, которым мы сделали new? А если например мы завели массив тех char'ов (без new, то есть чисто как char array[50]и работали с ним потом как с указателем, то нам потом не нужно ему делать delete?
нет, не нужно.Оператор delete вызывается только если память была выделена по средствам оператора new.
Геральт вне форума Ответить с цитированием
Старый 09.06.2011, 12:58   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2pilehead
Цитата:
Суть вот в чём: есть некая функция, работающая с массивами char. И мне нужно получить её результат. Как это сделать правильнее?
ну есть 4 способа возврата указателя из функции:
1. возврат указателя на глобальный массив
2. возврат указателя на static массив, определенный внутри функции
3. возврат указателя на массив, память для которого выделена внутри функции через return
4. возврат указателя на массив, память для которого выделена внутри функции через входящий параметр (указатель на указатель)

больше способов нет.
ну с первыми двумя и так ясно, остальные два:
Код:
char *getStr()
{
    char *str = new char[10];
    ...
    return str;
}

void getStr(char **str)
{
    *str = new char[10];
    ....
}

char *s1 = getStr();
...
delete [] s1;

char *s2;
getStr(&s2);
...
delete [] s2;
естественно нужно добавить проверки валидности указателя после возврата из функции, чтот типо
Код:
if (char *str = getStr()) {
    // указатель валидный, можно работать
    ...
    delete [] str;
}
ну и обычно для симметрии к getStr делают чтот типа freeStr.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции и указатели в С Maryko Помощь студентам 2 30.11.2010 09:01
Указатели на функции profi Общие вопросы C/C++ 20 12.07.2010 14:11
Не удаётся изменить переменную в ДЛЛ. Пошагово, она меняется. А при выходе из функции обратно TwiX Общие вопросы Delphi 6 23.05.2010 11:48
указатели на функции MeGaTpoH Общие вопросы C/C++ 2 18.06.2009 16:27
Указатели в функции. _LEON_ Общие вопросы C/C++ 4 04.02.2008 10:38