The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"malloc vs free"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"malloc vs free"
Сообщение от Simps Искать по авторуВ закладки(ok) on 16-Июн-04, 16:44  (MSK)
С ... Есть функция ...
int func() {
char *per;
per=(char *)malloc(500);
/*Какая нить лажа которая работает с переменной например */
    if ( ( per=strsep(&curline,"\"") ) != NULL ) {
        per=strsep(&curline,"\"");
    }
return(per);
}

Как в таком случае заfree'шить переменную per ?
На ретурн происходит выход из функции и пипец ... Переменная то не зафришина. Или функции давать аргументом адресс переменной из вне и писать значение в него ?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "malloc vs free"
Сообщение от vnp emailИскать по авторуВ закладки on 16-Июн-04, 20:56  (MSK)
>С ... Есть функция ...
>int func() {
>char *per;
>per=(char *)malloc(500);
>/*Какая нить лажа которая работает с переменной например */
>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>{
>        per=strsep(&curline,"\"");
>    }
>return(per);
>}
>
>Как в таком случае заfree'шить переменную per ?
>На ретурн происходит выход из функции и пипец ... Переменная то не
>зафришина. Или функции давать аргументом адресс переменной из вне и писать
>значение в него ?

Не понял, в чем проблема... per не пропадает -- вы же его возвращаете:
    ...
    var = func();
    ...
    free(var);
и все счастливы.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "malloc vs free"
Сообщение от klalafuda emailИскать по авторуВ закладки on 16-Июн-04, 21:33  (MSK)
>>С ... Есть функция ...
>>int func() {
>>char *per;
>>per=(char *)malloc(500);
>>/*Какая нить лажа которая работает с переменной например */
>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>>{
>>        per=strsep(&curline,"\"");
>>    }
>>return(per);
>>}
>>
>>Как в таком случае заfree'шить переменную per ?
>>На ретурн происходит выход из функции и пипец ... Переменная то не
>>зафришина. Или функции давать аргументом адресс переменной из вне и писать
>>значение в него ?
>
>Не понял, в чем проблема... per не пропадает -- вы же его
>возвращаете:
>    ...
>    var = func();
>    ...
>    free(var);
>и все счастливы.

сижу и плачу..

---cut---
char *per;
per=(char *)malloc(500);
if ( ( per=strsep(&curline,"\"") ) != NULL ) {
    per=strsep(&curline,"\"");
}
return(per);
---cut---

вам этот код ни о чем не говорит ?

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "malloc vs free"
Сообщение от vnp emailИскать по авторуВ закладки on 17-Июн-04, 00:10  (MSK)

>сижу и плачу..
>
>---cut---
>char *per;
>per=(char *)malloc(500);
>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>    per=strsep(&curline,"\"");
>}
>return(per);
>---cut---
>
>вам этот код ни о чем не говорит ?
>
>// wbr

Мда... читать надо было не только вопрос, но и код тоже. Не обратил внимания, виноват.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "malloc vs free"
Сообщение от genie Искать по авторуВ закладки on 17-Июн-04, 03:06  (MSK)
Sedelai tak:

char *pRet=strdup(per);
free(per);
return pRet;

>
>>сижу и плачу..
>>
>>---cut---
>>char *per;
>>per=(char *)malloc(500);
>>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>>    per=strsep(&curline,"\"");
>>}
>>return(per);
>>---cut---
>>
>>вам этот код ни о чем не говорит ?
>>
>>// wbr
>
>Мда... читать надо было не только вопрос, но и код тоже. Не
>обратил внимания, виноват.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "malloc vs free"
Сообщение от genie Искать по авторуВ закладки on 17-Июн-04, 03:08  (MSK)
Pardon: nado backup original'nogo 'per' sdelat':

char *origPer=per;
char *pRet;
....
pRet=strdup(per);
free(origPer);
return pRet;


>Sedelai tak:
>
>char *pRet=strdup(per);
>free(per);
>return pRet;
>
>
>
>>
>>>сижу и плачу..
>>>
>>>---cut---
>>>char *per;
>>>per=(char *)malloc(500);
>>>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>>>    per=strsep(&curline,"\"");
>>>}
>>>return(per);
>>>---cut---
>>>
>>>вам этот код ни о чем не говорит ?
>>>
>>>// wbr
>>
>>Мда... читать надо было не только вопрос, но и код тоже. Не
>>обратил внимания, виноват.


  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "malloc vs free"
Сообщение от sas emailИскать по авторуВ закладки(??) on 17-Июн-04, 09:09  (MSK)
Извините, но масло масленное и масленне не бывает...  pRet тоже должен быть освобожден...

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

Кстати, как указали уже в вышележащих постах код совершенно...

Удачи
--- sas

>Pardon: nado backup original'nogo 'per' sdelat':
>
>char *origPer=per;
>char *pRet;
>....
>pRet=strdup(per);
>free(origPer);
>return pRet;
>
>
>>Sedelai tak:
>>
>>char *pRet=strdup(per);
>>free(per);
>>return pRet;
>>
>>
>>
>>>
>>>>сижу и плачу..
>>>>
>>>>---cut---
>>>>char *per;
>>>>per=(char *)malloc(500);
>>>>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>>>>    per=strsep(&curline,"\"");
>>>>}
>>>>return(per);
>>>>---cut---
>>>>
>>>>вам этот код ни о чем не говорит ?
>>>>
>>>>// wbr
>>>
>>>Мда... читать надо было не только вопрос, но и код тоже. Не
>>>обратил внимания, виноват.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "malloc vs free"
Сообщение от Simps Искать по авторуВ закладки(ok) on 17-Июн-04, 10:59  (MSK)
>>>С ... Есть функция ...
>>>int func() {
>>>char *per;
>>>per=(char *)malloc(500);
>>>/*Какая нить лажа которая работает с переменной например */
>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>>>{
>>>        per=strsep(&curline,"\"");
>>>    }
>>>return(per);
>>>}
>>>
>>>Как в таком случае заfree'шить переменную per ?
>>>На ретурн происходит выход из функции и пипец ... Переменная то не
>>>зафришина. Или функции давать аргументом адресс переменной из вне и писать
>>>значение в него ?
>>
>>Не понял, в чем проблема... per не пропадает -- вы же его
>>возвращаете:
>>    ...
>>    var = func();
>>    ...
>>    free(var);
>>и все счастливы.
>
>сижу и плачу..
>
>---cut---
>char *per;
>per=(char *)malloc(500);
>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>    per=strsep(&curline,"\"");
>}
>return(per);
>---cut---
>
>вам этот код ни о чем не говорит ?
>
>// wbr
А если с комментариями ... ?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "malloc vs free"
Сообщение от sas emailИскать по авторуВ закладки(??) on 17-Июн-04, 11:20  (MSK)
>>>>С ... Есть функция ...
>>>>int func() {
>>>>char *per;
>>>>per=(char *)malloc(500);
>>>>/*Какая нить лажа которая работает с переменной например */
>>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>>>>{
>>>>        per=strsep(&curline,"\"");
>>>>    }
>>>>return(per);
>>>>}
>>>>
>>>>Как в таком случае заfree'шить переменную per ?
>>>>На ретурн происходит выход из функции и пипец ... Переменная то не
>>>>зафришина. Или функции давать аргументом адресс переменной из вне и писать
>>>>значение в него ?
>>>
>>>Не понял, в чем проблема... per не пропадает -- вы же его
>>>возвращаете:
>>>    ...
>>>    var = func();
>>>    ...
>>>    free(var);
>>>и все счастливы.
>>
>>сижу и плачу..
>>
>>---cut---
>>char *per;
>>per=(char *)malloc(500);
>>if ( ( per=strsep(&curline,"\"") ) != NULL ) {
>>    per=strsep(&curline,"\"");
>>}
>>return(per);
>>---cut---
>>
>>вам этот код ни о чем не говорит ?
>>
>>// wbr
>А если с комментариями ... ?

Внимательно прочитайте

man strsep

Удачи
--- sas

  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "malloc vs free"
Сообщение от vnp emailИскать по авторуВ закладки on 17-Июн-04, 11:53  (MSK)
>А если с комментариями ... ?

Sorry for English. Russian version tomorrow.

It was my fault anyway, and it's me to clear the things up.

>>>>char *per;
>>>>per=(char *)malloc(500);
...
>>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )

Now 'per' points somewhere into a curline. An allocated value is gone. Freeing 'per' is _wrong_.

Did you really wanted to allocate it?


  Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "malloc vs free"
Сообщение от Simps Искать по авторуВ закладки(ok) on 17-Июн-04, 12:18  (MSK)
>>А если с комментариями ... ?
>
>Sorry for English. Russian version tomorrow.
>
>It was my fault anyway, and it's me to clear the things
>up.
>
>>>>>char *per;
>>>>>per=(char *)malloc(500);
>...
>>>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>
>Now 'per' points somewhere into a curline. An allocated value is gone.
>Freeing 'per' is _wrong_.
>
>Did you really wanted to allocate it?

Я прошу прощения, просто у меня свой алгоритм работы =) Я пишу пост на опеннет и не дожидаясь ответа рою сам. Так же получилось и в этом случае =) На момент ваших ответов я уже перечитав кучу док и манов пришел к правильному решению. Вот мой окончательный вариант моей функции

char* getcharvalue(curline)
char *curline;
{

    char *tmpstr;
    char *tmpbuf;
    if ( *(curline) == NULL  ) {
        printf("ERROR: getcharvalue() - empty input\n");
        return(NULL);
    }
    if ( ( tmpbuf = strdup(curline) ) == NULL ) {
        printf("ERROR: getcharvalue() - strdup() memory error\n");
        return(NULL);
    }
    tmpstr=strsep(&curline,"=");
    tmpstr=strsep(&curline,"\0");
    if ( *(tmpstr) == NULL  ) {
        printf("ERROR: Check config file! getcharvalue() - empty field after '=', original string \"%s\"\n",
        tmpbuf);
        free(tmpbuf);
        return(NULL);
    }
    free(tmpbuf);
    return(tmpstr);

}

Буду рад услышать коменты

  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "malloc vs free"
Сообщение от sas emailИскать по авторуВ закладки(??) on 17-Июн-04, 13:22  (MSK)
Уважаемый Simps,

У Вас есть как минимум одна ошибка в коде.

Кроме того он не эффективен: Вы выделяете динамическую память там где не надо, а это дорогостоящая операция.

Я тут набросал примерный код (если конечно я правильно понял Вашу цель)

char *getvalue( const char *p_line )
{
  char *p_res = NULL;
  
  if ( p_line ) {
    p_res = strchr( p_line, '=' );
    if ( p_res && *(p_res + 1) ) p_res++;
    else p_res = NULL;
  }

  return p_res;
}

void processing( const char *s )
{
  char *v;

  if ( !s ) fprintf( stderr, "Pair string is NULL!!!\n" );
  else {
    v = getvalue( s );
    if ( !v )
      fprintf( stderr, "ERROR: Wrong pair!!! [%s]\n", s );
    else
      fprintf( stdout, "Good pair [%s]; value is [%s]\n", s, v );
  }
}

/*== test == */
  char *pairs[] = {
    "",
    "2 not equal",
    "=",
    "p0 =",  
    "p1=   bbb bbb bbbb    ",
    "p2=[sssssss ssssssssss ssssssssssss]",
    NULL
  };
  char **p = (char **)pairs;

  while ( *p ) processing( *p++ );

Что тут важно:

1 нет копирований
2 нет выделения освобождения памяти
3 нет изменения исходных данных
4 получение значения вынесено отдельно от диагностики, специфичной для данной программы, что означает, что getvalue может быть использована позже в других приложениях
5 Для печати ошибок и сообщения об успехе использутся stderr и stdout. Как Вы наверное знаете stderr не буферизируется, что безусловно важно при аварийном завершении программы. В случае с stdout есть вероятность что часть информации так и не будет выведена на терминал

Удачи
--- sas

ЗЫ код не тестирован и тоже может быть с ошибками :O)

>>>А если с комментариями ... ?
>>
>>Sorry for English. Russian version tomorrow.
>>
>>It was my fault anyway, and it's me to clear the things
>>up.
>>
>>>>>>char *per;
>>>>>>per=(char *)malloc(500);
>>...
>>>>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>>
>>Now 'per' points somewhere into a curline. An allocated value is gone.
>>Freeing 'per' is _wrong_.
>>
>>Did you really wanted to allocate it?
>
>Я прошу прощения, просто у меня свой алгоритм работы =) Я пишу
>пост на опеннет и не дожидаясь ответа рою сам. Так же
>получилось и в этом случае =) На момент ваших ответов я
>уже перечитав кучу док и манов пришел к правильному решению. Вот
>мой окончательный вариант моей функции
>
>char* getcharvalue(curline)
>char *curline;
>{
>
>    char *tmpstr;
>    char *tmpbuf;
>    if ( *(curline) == NULL  ) {
>
>        printf("ERROR: getcharvalue() - empty
>input\n");
>        return(NULL);
>    }
>    if ( ( tmpbuf = strdup(curline) ) ==
>NULL ) {
>        printf("ERROR: getcharvalue() - strdup()
>memory error\n");
>        return(NULL);
>    }
>    tmpstr=strsep(&curline,"=");
>    tmpstr=strsep(&curline,"\0");
>    if ( *(tmpstr) == NULL  ) {
>
>        printf("ERROR: Check config file!
>getcharvalue() - empty field after '=', original string \"%s\"\n",
>        tmpbuf);
>        free(tmpbuf);
>        return(NULL);
>    }
>    free(tmpbuf);
>    return(tmpstr);
>
>}
>
>Буду рад услышать коменты

  Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "malloc vs free"
Сообщение от Simps Искать по авторуВ закладки(ok) on 18-Июн-04, 09:40  (MSK)
>Уважаемый Simps,
>
>У Вас есть как минимум одна ошибка в коде.
>
>Кроме того он не эффективен: Вы выделяете динамическую память там где не
>надо, а это дорогостоящая операция.
>
>Я тут набросал примерный код (если конечно я правильно понял Вашу цель)
>
>
>char *getvalue( const char *p_line )
>{
>  char *p_res = NULL;
>
>  if ( p_line ) {
>    p_res = strchr( p_line, '=' );
>    if ( p_res && *(p_res + 1) )
>p_res++;
>    else p_res = NULL;
>  }
>
>  return p_res;
>}
>
>void processing( const char *s )
>{
>  char *v;
>
>  if ( !s ) fprintf( stderr, "Pair string is NULL!!!\n"
>);
>  else {
>    v = getvalue( s );
>    if ( !v )
>      fprintf( stderr, "ERROR: Wrong pair!!! [%s]\n",
>s );
>    else
>      fprintf( stdout, "Good pair [%s]; value
>is [%s]\n", s, v );
>  }
>}
>
>/*== test == */
>  char *pairs[] = {
>    "",
>    "2 not equal",
>    "=",
>    "p0 =",
>    "p1=   bbb bbb bbbb  
> ",
>    "p2=[sssssss ssssssssss ssssssssssss]",
>    NULL
>  };
>  char **p = (char **)pairs;
>
>  while ( *p ) processing( *p++ );
>
>Что тут важно:
>
>1 нет копирований
>2 нет выделения освобождения памяти
>3 нет изменения исходных данных
>4 получение значения вынесено отдельно от диагностики, специфичной для данной программы, что
>означает, что getvalue может быть использована позже в других приложениях
>5 Для печати ошибок и сообщения об успехе использутся stderr и stdout.
>Как Вы наверное знаете stderr не буферизируется, что безусловно важно при
>аварийном завершении программы. В случае с stdout есть вероятность что часть
>информации так и не будет выведена на терминал
>
>Удачи
>--- sas
>
>ЗЫ код не тестирован и тоже может быть с ошибками :O)
>
>>>>А если с комментариями ... ?
>>>
>>>Sorry for English. Russian version tomorrow.
>>>
>>>It was my fault anyway, and it's me to clear the things
>>>up.
>>>
>>>>>>>char *per;
>>>>>>>per=(char *)malloc(500);
>>>...
>>>>>>>    if ( ( per=strsep(&curline,"\"") ) != NULL )
>>>
>>>Now 'per' points somewhere into a curline. An allocated value is gone.
>>>Freeing 'per' is _wrong_.
>>>
>>>Did you really wanted to allocate it?
>>
>>Я прошу прощения, просто у меня свой алгоритм работы =) Я пишу
>>пост на опеннет и не дожидаясь ответа рою сам. Так же
>>получилось и в этом случае =) На момент ваших ответов я
>>уже перечитав кучу док и манов пришел к правильному решению. Вот
>>мой окончательный вариант моей функции
>>
>>char* getcharvalue(curline)
>>char *curline;
>>{
>>
>>    char *tmpstr;
>>    char *tmpbuf;
>>    if ( *(curline) == NULL  ) {
>>
>>        printf("ERROR: getcharvalue() - empty
>>input\n");
>>        return(NULL);
>>    }
>>    if ( ( tmpbuf = strdup(curline) ) ==
>>NULL ) {
>>        printf("ERROR: getcharvalue() - strdup()
>>memory error\n");
>>        return(NULL);
>>    }
>>    tmpstr=strsep(&curline,"=");
>>    tmpstr=strsep(&curline,"\0");
>>    if ( *(tmpstr) == NULL  ) {
>>
>>        printf("ERROR: Check config file!
>>getcharvalue() - empty field after '=', original string \"%s\"\n",
>>        tmpbuf);
>>        free(tmpbuf);
>>        return(NULL);
>>    }
>>    free(tmpbuf);
>>    return(tmpstr);
>>
>>}
>>
>>Буду рад услышать коменты

Большуший респект за коменты и критику ! =))) Как обычно элегантное решение лежит на поверхности и остается незаслуженно незамеченым =)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "malloc vs free"
Сообщение от klalafuda emailИскать по авторуВ закладки on 17-Июн-04, 14:34  (MSK)
>Я прошу прощения, просто у меня свой алгоритм работы =) Я пишу
>пост на опеннет и не дожидаясь ответа рою сам. Так же
>получилось и в этом случае =) На момент ваших ответов я
>уже перечитав кучу док и манов пришел к правильному решению. Вот
>мой окончательный вариант моей функции

если он действительно окончательный, то мои вам соболезнования

>char* getcharvalue(curline)
>char *curline;
>{

1. таки скорее char *getcharvalue(const char *curline)
2. K&R arguments definition плавно но неумолимо умирает

>    char *tmpstr;
>    char *tmpbuf;
>    if ( *(curline) == NULL  ) {
>
>        printf("ERROR: getcharvalue() - empty
>input\n");
>        return(NULL);
>    }

3. нет проверки на curline == NULL -> железный SIGSEGV при кривых аргументах вызова
4. сравнивать char и NULL некорректно

>    if ( ( tmpbuf = strdup(curline) ) ==
>NULL ) {
>        printf("ERROR: getcharvalue() - strdup()
>memory error\n");
>        return(NULL);
>    }

5. зачем выделять tmpbuf если вы по-живому режете curline ? который должен быть const

>    tmpstr=strsep(&curline,"=");

6. strsep - вещь нестандартизированная и непереносимая

>    tmpstr=strsep(&curline,"\0");

7. какой смысл вы вкладываете в это выражение ?

>    if ( *(tmpstr) == NULL  ) {
>        printf("ERROR: Check config file!
>getcharvalue() - empty field after '=', original string \"%s\"\n",
>        tmpbuf);
>        free(tmpbuf);
>        return(NULL);
>    }
>    free(tmpbuf);
>    return(tmpstr);

8. и что же вы в результате возвращаете ? вы это то-же будете передавать во free() ?

>}

// wbr

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру