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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> освобождение памяти после выхода из функции 
:(
    Опции темы
Ostap
Дата 15.2.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если я объявляю функцию

Код

double * somefunction(<...>);


Код

<...>
double * somefunction(<...>)
{
   double *any = NULL;
   any = (double *)calloc(NUM, sizeof(double));
<...>
   return any;
}

Так как я явно не пишу free(any), то меня интересует освободится ли память после возращения значения?
PM MAIL   Вверх
Ignat
Дата 15.2.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Ostap @ 15.2.2006, 13:21 Найти цитируемый пост)
то меня интересует освободится ли память после возращения значения?

А значение возвращено не будет. Будет возвращен указатель.
А смысл освобождать? Ведь полученное значение будет использоваться впоследствии.


--------------------
Теперь при чем :P
PM   Вверх
Ostap
Дата 15.2.2006, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

<...>
int main(int argc, char *argv[])
{
   double *some = NULL;
   some = (double *)calloc(NUM, sizeof(double));

   <...>
   some = somefunction(<...>);
   <...>
   free(some);
   return 1;
}

<...>    
double * somefunction(<...>)    
{    
   double *any = NULL;    
   any = (double *)calloc(NUM, sizeof(double));    
   <...>    
   return any;    
}


Это корректный код?

P.s. Я понимаю что можно сделать:
Код

int somefunction(double *some, <...>)
{
<...>
   return 1;
}

Но нужна схема, примерно описанная в первом случае.
PM MAIL   Вверх
Ignat
Дата 15.2.2006, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Ostap @ 15.2.2006, 15:13 Найти цитируемый пост)
  free(some);

Вот здесь и произойдет освобождение.

Цитата(Ostap @ 15.2.2006, 15:13 Найти цитируемый пост)
some = (double *)calloc(NUM, sizeof(double));

А вот это необязательно, точнее даже: так делать не нужно.

т.к. после выполнения
Цитата(Ostap @ 15.2.2006, 15:13 Найти цитируемый пост)
some = somefunction(<...>);

в some будет указатель на другую область памяти, нежели выделенная первоначально.



--------------------
Теперь при чем :P
PM   Вверх
Ostap
Дата 15.2.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ага.
Т.е. будет достаточно одного calloc в теле вызываемой функции?
Спасибо.
PM MAIL   Вверх
Ignat
Дата 15.2.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Ostap @ 15.2.2006, 15:43 Найти цитируемый пост)
Спасибо.

Всегда пожалуйста smile
Но я бы предпочел второй вариант, т.е. передать указатель как параметр. При таком решении calloc и free находятся в одной функции, а в том варианте, который сейчас - в разных. Технически разницы нет, когда выделять, когда освобождать, но повышается читабельность кода (ИМХО).


--------------------
Теперь при чем :P
PM   Вверх
Neitron
Дата 15.2.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Повышается безопасность кода.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Breezy
Дата 16.2.2006, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ignat

Цитата

т.к. после выполнения
some = somefunction(<...>);
в some будет указатель на другую область памяти, нежели выделенная первоначально.


Ты уверен?

Человеку нужен конструктор и деструктор...

Следовательно стоит написать нечто подобное на вектор ... тоесть управлять памятью не прямо.

просто вот такой прикол:

Код

XXXX *pXXXX=0;
pXXXX = (XXXX*)calloc(...);

free(pXXXX);
free(pXXXX);


а ведь можно сделать обертку чото типа:
Код

MyFree(void **pData);
{
     if(*pData!=0)
     free(*pData);

     pData=0;
}

И можно удалять память до бесконечности...


PM MAIL   Вверх
Ignat
Дата 16.2.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Breezy @ 16.2.2006, 10:48 Найти цитируемый пост)
Ты уверен?

А есть другие варианты? smile


Цитата(Breezy @ 16.2.2006, 10:48 Найти цитируемый пост)
а ведь можно сделать обертку чото типа:

Как гарант корректного освобождения это хороший вариант.


--------------------
Теперь при чем :P
PM   Вверх
Breezy
Дата 16.2.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ignat
Цитата

Как гарант корректного освобождения это хороший вариант.


Если делать обертку для освобождения то неплохобы сделать и для выделения памяти smile
PM MAIL   Вверх
Mayk
Дата 16.2.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Breezy @ 16.2.2006, 14:48 Найти цитируемый пост)
    if(*pData!=0)
    free(*pData);

тогда уж лучше
Код

void MyFree(void **pData);
{
     if(pData!=0){
          free(*pData);
          pData=0;
     }
}




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Ignat
Дата 16.2.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(Mayk @ 16.2.2006, 14:45 Найти цитируемый пост)
тогда уж лучше

Ээээ... Чем?


--------------------
Теперь при чем :P
PM   Вверх
Mayk
Дата 16.2.2006, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Ignat @ 16.2.2006, 18:55 Найти цитируемый пост)

Ээээ... Чем?

Таким образом мы не нарушаем стандартное поведение free.
free(NULL) - это абсолютно легальная конструкция.(так же как и delete NULL кстати говоря).
MyFree(NULL) в оригинале просто вылетит.

Цитата(Breezy @ 16.2.2006, 14:48 Найти цитируемый пост)
  if(*pData!=0)
    free(*pData);

Смысла в этом if'е воообще никакого нет. Убери его - никто не заметит абсолютно никакой разницы.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Breezy
Дата 16.2.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Mayk,

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

если уж на то пошло то код должен принять вид

void MyFree(void **pData);
{
if(pData!=0)
{
free(*pData);
*pData=0;//ошибочка закралась
}
}
PM MAIL   Вверх
DeadSoul
Дата 16.2.2006, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Breezy @ 16.2.2006, 10:48 Найти цитируемый пост)
Следовательно стоит написать нечто подобное на вектор ... тоесть управлять памятью не прямо.


Breezy, именно так. А если заменить malloc на new, free на delete, то можно возвращать прямо std::vector(using ReturnValueOptimisation)

Или(используем new+delete, а не malloc+free!):
Код

boost::shared_array<double> somefunction(<...>)   ;



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

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0993 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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