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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат строки неизвестного размера из функции, работа с выделением памяти в функции 
V
    Опции темы
mes
Дата 6.6.2008, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(JackYF @  6.6.2008,  13:25 Найти цитируемый пост)
1) целевой язык - С

Цитата(JackYF @  6.6.2008,  13:25 Найти цитируемый пост)
char* p = new char[size];

 smile  smile 

Цитата(ama_kid @  6.6.2008,  13:19 Найти цитируемый пост)
сам же на свой вопрос вывесил в топике ответ - ссылка ответа от RAN

как я понял имеется ввиду этот ответ:
http://forum.vingrad.ru/index.php?showtopi...st&p=109698

Код

void change_string(char* param) // передаем указатель на память 
{
   delete param; // удаляем .. не этично, хотя сработает если внимательно следить  
   const char str[] = "new string";
   param = NULL;
   param = new char[ sizeof(str) ]; // выделили память - но она станет не валидной после завершения функции 

// как минимум надо было  написать void change_string(char*&param) -
// но даже в ьтом случае пример выглядит не очень приятно ))





Это сообщение отредактировал(а) mes - 6.6.2008, 13:33


--------------------
PM MAIL WWW   Вверх
Fazil6
Дата 6.6.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ama_kid @  6.6.2008,  13:19 Найти цитируемый пост)
ссылка ответа от RAN. В связи с этим вопрос - насколько корректен приведённый там пример?


Зная этого чела лично, могу сказать с определенностью, что сейчас он так делать не стал бы.  smile 
Я тоже так делать не сталбы.
Код

void getTq(char * p)
{
    delete p;   //  ЧПОК!!!!!!!!
}


int main()
{
    char s[] = "!!!";
    getTq(s);
    return 0;
}

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


Новичок



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

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



Цитата(mes @  6.6.2008,  13:32 Найти цитируемый пост)
param = new char[ sizeof(str) ]; // выделили память - но она станет не валидной после завершения функции 

ну вот, приехали. new, оказывается, выделяет память в стеке? или C++ обзавелся хитрым сборщиком мусора, который подтирает всю выделенную в функции память?
PM MAIL   Вверх
mes
Дата 6.6.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(nirburg @  6.6.2008,  13:41 Найти цитируемый пост)
Цитата(mes @  6.6.2008,  13:32 )
param = new char[ sizeof(str) ]; // выделили память - но она станет не валидной после завершения функции 
ну вот, приехали. new, оказывается, выделяет память в стеке? или C++ обзавелся хитрым сборщиком мусора, который подтирает всю выделенную в функции память? 

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

в коментариях в предыдушем посту это и указано  ))

Это сообщение отредактировал(а) mes - 6.6.2008, 13:48


--------------------
PM MAIL WWW   Вверх
Daevaorn
Дата 6.6.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(mes @  6.6.2008,  14:47 Найти цитируемый пост)
просто значения указателя не возврашается из функции - т.е указатель переданный в функцию, после ее завершения, продолжает показывать  на ту же самую область что и раньше

Не, ну выделить память внутри функции и выдать её наружу вполне себе юзкейс. Так, допустим, malloc поступаетsmile
PM MAIL WWW   Вверх
mes
Дата 6.6.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Daevaorn @  6.6.2008,  13:59 Найти цитируемый пост)
Не, ну выделить память внутри функции и выдать её наружу вполне себе юзкейс. Так, допустим, malloc поступает 

нет проблемы в том, чтоб выделить память внутри функции
проблема в том чтоб знать когда она выделилась и удалить ее когда нужно.
и самое главное, чтоб этот процесс не отвлекал от основной цели - программирование,
ибо если постояно помнить реализацию каждой функции, то и с ума сойти можно  smile 



--------------------
PM MAIL WWW   Вверх
nirburg
Дата 6.6.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mes, прошу прощения, неправильно понял smile да, вы правы, param будет указывать в космос

Daevaorn, ну malloc'y на роду написано память внутри себя выделять. а если так будет поступать каждая гордая функция, то что с программой будет твориться, я не представляю
PM MAIL   Вверх
mes
Дата 6.6.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



malloc и new тем и хороши что всегда не задумываясь (о том как реализована функция) понятно, что делает функция и одназначно напрашивается вывод о применение ее антонима.
однако, что нужно делать после функции GetString (..) (удалять память или нет)  имхо отнюдь не очевидно  smile 
поэтому (на мой взгляд)  и принято "неписанное " соглашении о использовании внутри функции зараннее выделенного буффера..

Это сообщение отредактировал(а) mes - 6.6.2008, 14:12


--------------------
PM MAIL WWW   Вверх
Daevaorn
Дата 6.6.2008, 14:15 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(mes @  6.6.2008,  15:07 Найти цитируемый пост)
поьтому и принято (на мой взгляд) "неписанное " соглашении о использовании внутри функции зараннее выделенного буффера

а если строка больше чем буфер? Тогда ещё одну функцию заводить, которая вернет размер, потом выделить память, и только потом передать в функцию - много буквsmile

Хотя, конечно, это оптимально с точки зрения прозрачности кода.
PM MAIL WWW   Вверх
JackYF
Дата 6.6.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(nirburg @  6.6.2008,  12:28 Найти цитируемый пост)
JackYF, в C нет new и delete 

 smile Верно smile
Код

char* func(int param)
{
  unsigned int size;
  //...
  char* p = (char*) malloc(size);
  return p;
}
//...
char* u = func(n);
//...
free(u);




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
mes
Дата 6.6.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Daevaorn @  6.6.2008,  14:15 Найти цитируемый пост)
а если строка больше чем буфер? Тогда ещё одну функцию заводить, которая вернет размер, потом выделить память, и только потом передать в функцию - много букв  

вот пример без добавления второй функции 
Код


int GetString (char *p, int size) // возврашает кол-во символов непоместившихся в буффер
{ ..
};

void Test()
{
   int size =   GetString( NULL, 0);

   char *p = new char(size); 
   GetString(p, size);
   ...
   delete...

};



--------------------
PM MAIL WWW   Вверх
Daevaorn
Дата 6.6.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(mes @  6.6.2008,  16:01 Найти цитируемый пост)
вот пример без добавления второй функции 

ну по сути вы её добавили, сделав в GetString проверку `if( p == 0 )`.
PM MAIL WWW   Вверх
ama_kid
Дата 6.6.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



В общем, как я понял, сделать средствами new\delete (без привлечения библиотек-контейнеров и выкрутасов с несколькими функциями\вызовами) аналогичный дельфёвому фокус не удастся. Что ж, будет еще один плюс в пользу malloc\realloc smile  Думаю, тему можно закрывать, потому что обсуждение идет по десятому кругу, всем спасибо за активное обсуждение...  smile
Хотя, если появятся новые идеи - буду рад увидеть, да и для потомков, думаю, будет полезно...  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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