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


Автор: Ostap 15.2.2006, 13:21
Если я объявляю функцию

Код

double * somefunction(<...>);


Код

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

Так как я явно не пишу free(any), то меня интересует освободится ли память после возращения значения?

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

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

Автор: Ostap 15.2.2006, 15:13
Код

<...>
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;
}

Но нужна схема, примерно описанная в первом случае.

Автор: Ignat 15.2.2006, 15:19
Цитата(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 будет указатель на другую область памяти, нежели выделенная первоначально.

Автор: Ostap 15.2.2006, 15:43
Ага.
Т.е. будет достаточно одного calloc в теле вызываемой функции?
Спасибо.

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

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

Автор: Neitron 15.2.2006, 15:53
Повышается безопасность кода.

Автор: Breezy 16.2.2006, 10:48
Ignat

Цитата

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


Ты уверен?

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

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

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

Код

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

free(pXXXX);
free(pXXXX);


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

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

     pData=0;
}

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


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

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


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

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

Автор: Breezy 16.2.2006, 14:43
Ignat
Цитата

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


Если делать обертку для освобождения то неплохобы сделать и для выделения памяти smile

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

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

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


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

Ээээ... Чем?

Автор: Mayk 16.2.2006, 15:03
Цитата(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'е воообще никакого нет. Убери его - никто не заметит абсолютно никакой разницы.

Автор: Breezy 16.2.2006, 16:41
Mayk,

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

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

void MyFree(void **pData);
{
if(pData!=0)
{
free(*pData);
*pData=0;//ошибочка закралась
}
}

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


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

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

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

Автор: Ignat 17.2.2006, 10:52
Цитата(DeadSoul @ 16.2.2006, 22:36 Найти цитируемый пост)
А если заменить malloc на new, free на delete,

Для чистых сей низзя smile

Автор: DeadSoul 17.2.2006, 23:02
Цитата(Ignat @ 17.2.2006, 10:52 Найти цитируемый пост)
Цитата(DeadSoul @ 16.2.2006, 22:36 )
А если заменить malloc на new, free на delete,
Для чистых сей низзя 

Ты уверен, что у человека чистые Си?

Автор: Ignat 17.2.2006, 23:14
Цитата(DeadSoul @ 17.2.2006, 23:02 Найти цитируемый пост)
Ты уверен, что у человека чистые Си?

Нет, но зачем юзать malloc в С++ ума не приложу, там есть new.
Пока скудные фрагменты кода, которые видели больше тянут на чистые Си.

Автор: DeadSoul 17.2.2006, 23:48
Цитата(Ignat @ 17.2.2006, 23:14 Найти цитируемый пост)
Цитата(DeadSoul @ 17.2.2006, 23:02 )
Ты уверен, что у человека чистые Си?
Нет, но зачем юзать malloc в С++ ума не приложу, там есть new.
Пока скудные фрагменты кода, которые видели больше тянут на чистые Си.

От незнания

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