URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 48080
[ Назад ]

Исходное сообщение
"Динамическое выделение памяти"

Отправлено Roman , 09-Сен-04 12:54 
Уважаемые, подскажите новичку в чем проблема
Имеем FreeBSD 4.10 и вот такой скрипт:
while(nado)
{
  ptr = malloc(kolvo);
  sprintf(ptr...);
  free(ptr);
}
Так вот выделяется, но не освобождается !, синтаксис сто раз проверял,
если ставлю два free() подряд, то второй говорит что "данный сегмент
уже свободен", но в результате через 20 сек. работы память
всеравно заканчивается.

Содержание

Сообщения в этом обсуждении
"Динамическое выделение памяти"
Отправлено Maxim A.Kuznetcov , 09-Сен-04 14:08 
>Уважаемые, подскажите новичку в чем проблема
>Имеем FreeBSD 4.10 и вот такой скрипт:
>while(nado)
>{
>  ptr = malloc(kolvo);
>  sprintf(ptr...);
>  free(ptr);
>}
>Так вот выделяется, но не освобождается !, синтаксис сто раз проверял,
>если ставлю два free() подряд, то второй говорит что "данный сегмент
>уже свободен", но в результате через 20 сек. работы память
>всеравно заканчивается.

видимо каким-то принтом вы пашете память за границей выделенного куска
скорее всего баг в sprintf - вместо него лучше ВСЕГДА ипользовать snprintf
в Вашем случае надо : snprintf(ptr,kolvo,...);



"Динамическое выделение памяти"
Отправлено Roman , 09-Сен-04 14:23 
Изначально о том и думал чтобы не запахать чего лишнего, иначе
с динамикой и возиться бы не стал
Вот полный код:

  char *buf;
  string temp;
  unsigned int count = 0;

  count = sprintf(NULL, "%d", param);
  buf = (char *) malloc(count * sizeof(char));
  if (!buf) { printf("NO AVAILABLE MEMORY !!!\n"); exit(1); }
  sprintf(buf, "%d", param);
  temp.append(buf, count);
  free(buf);

  return temp;


"Динамическое выделение памяти"
Отправлено Roman , 09-Сен-04 14:56 
Все, тема закрыта, спасибо натолкнули на мысль... ж)
оказывается sprintf в NULL это непросто в NULL,
а в память куда бог пошлет,
да еще и с попутным ее приватизированием... ;)