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

Поиск:

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(mes @  6.6.2008,  12:16 Найти цитируемый пост)
или "чистый" виртуальный интерфейс

даже чистый вирт интерфейс не может работать с переменными типов std::auto_ptr и т.п.


--------------------
user posted image    user posted image
PM MAIL   Вверх
mes
Дата 6.6.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alek86 @  6.6.2008,  12:24 Найти цитируемый пост)
даже чистый вирт интерфейс не может работать с переменными типов std::auto_ptr и т.п. 

естественно ..  однако это не мешает использовать нам их в реализации ..




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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(ama_kid @  6.6.2008,  12:17 Найти цитируемый пост)
Повторюсь - что в этом случае с областью видимости в случае использования внутри функции? Ничего, что мы выделяем память, которая будет невалидна потом?

все будет ОК, что-бы удалить блок памяти, не нужно знать его размер
PM MAIL Skype GTalk   Вверх
nirburg
Дата 6.6.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ama_kid @  6.6.2008,  12:17 Найти цитируемый пост)
"а нельзя ли сделать как-нить эдак, чтобы не так?!"

как-нибудь эдак, конечно, можно. вопрос - нужно ли? smile 

(шепотом) там народ уже интерфейсы обсуждает )) скоро, чувствую, все сведется к необходимости создания дерева классов со сложной иерархией, наследованием, и прочей модной шелухой =)
PM MAIL   Вверх
mes
Дата 6.6.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



тем более вопрос был не об auto_ptr , а о том как избежать проблем с выделением памяти внутри функции

Добавлено через 1 минуту и 11 секунд
Цитата(nirburg @  6.6.2008,  12:32 Найти цитируемый пост)
(шепотом) там народ уже интерфейсы обсуждает )) скоро, чувствую, все сведется к необходимости создания дерева классов со сложной иерархией, наследованием, и прочей модной шелухой =) 

))



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


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


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

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



Цитата(Lazin @  6.6.2008,  12:31 Найти цитируемый пост)
все будет ОК, что-бы удалить блок памяти, не нужно знать его размер 
Удалить-то мы его удалим, а куда денется выделенная по-новой память при выходе из функции?



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
mes
Дата 6.6.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ama_kid @  6.6.2008,  12:35 Найти цитируемый пост)
Удалить-то мы его удалим, а куда денется выделенная по-новой память при выходе из функции?

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


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


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


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

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



Цитата(mes @  6.6.2008,  12:39 Найти цитируемый пост)
в остальных как и говорилось выше - нужно выделять памятж вне функции
Опять же - а если вне функции неизвестен размер требуемой памяти?

Хорошо, у меня вроде бы сформировался более-менее основной вопрос, попробую его сформулировать: как после выполнения оператора
Код

char * s = new char[2] = "";
... 
 s = GetString();
...
delete s;
получить корректный буфер s (т.е. что должно быть вместо "..." и внутри функции GetString? ), при условиях: 
1) размер строки становится известен только внутри GetString()... 
2) пользуясь new\delete? 
P.S. Для случаев с malloc\realloc\free я более-менее уже понимаю... 



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
vinter
Дата 6.6.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



присваивать так низя, юзай strcpy


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


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


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

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



Цитата(vinter @  6.6.2008,  13:01 Найти цитируемый пост)
присваивать так низя, юзай strcpy 
что передавать в strcpy? 
Ну это гипотетический пример, хоть strcpy, хоть что-то другое , без разницы, главное - на выходе получить валидный буфер


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


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Fazil6
Дата 6.6.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ama_kid @  6.6.2008,  12:51 Найти цитируемый пост)
получить корректный буфер s (т.е. что должно быть вместо "..." и внутри функции GetString? ), при условиях: 
1) размер строки становится известен только внутри GetString()... 
2) пользуясь new\delete? 

Код

unsigned int GetString( char* buf , unsigned int buf_len)
{
     // пишем сколько влазит
     // возвращаем сколько нужно чтобы влезло
}

// если вернуло больше чем buf_len, то значит вернули не все


Добавлено через 1 минуту и 8 секунд
кстати 
Код

delete [] s;

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


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


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

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



Fazil6, ага, вариант понятен... В принципе, я так и делал всегда...

Кстати, щас только сообразил, что непроходимо туплю - сам же на свой вопрос вывесил в топике ответ - ссылка ответа от RAN. В связи с этим вопрос - насколько корректен приведённый там пример? Просто никто там после этого не отписался по поводу правильности\неправильности. Если он правилен - тогда вопрос снимается...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
JackYF
Дата 6.6.2008, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ого, сколько написали...

Подытожу по себе (то есть, как бы это делал я).
Варианта 2:

1) целевой язык - С

Код

char* func(int param)
{
  unsigned int size;
  //...
  char* p = new char[size];
  return p;
}

//...
char* u = func(n);
//...
delete [] u;


2) целевой язык - С++
Код

std::string func(int param)
{
  std::string buf;
  //...
  return buf;
}

//...

std::string u = func(n);
//...


В первом случае ты сам заботишься о том, чтобы освободить выделенную внутри функции память, во втором случае за тебя всё уже сделано.

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


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


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


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

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



Цитата(JackYF @  6.6.2008,  13:25 Найти цитируемый пост)
В первом случае ты сам заботишься о том, чтобы освободить выделенную внутри функции память
ага, а не будет ли в этом случае Access Violation в связи с доступом к невалидному участку памяти? Или участок памяти, выделенный внутри функции будет валидным?



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
nirburg
Дата 6.6.2008, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



JackYF, в C нет new и delete  smile 
PM MAIL   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0839 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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