Несколько вызовов в Realloc (), по -видимому, вызывает коррупцию кучи

StackOverflow https://stackoverflow.com/questions/2993094

  •  24-10-2019
  •  | 
  •  

Вопрос

В чем проблема с этим кодом? Он сбой каждый раз.

Однажды это неудачное утверждение "_asserte (_crtisvalidheAppointer (puserdata));", в других случаях это просто ошибка "коррекции кучи".

Изменение размера буфера влияет на эту проблему в некоторых странных способах - иногда он рушится на «Realloc», а в других случаях - на «свободном».

Я отлаживал этот код много раз, и нет ничего ненормального в отношении указателей.

char buf[2000];
char *data = (char*)malloc(sizeof(buf));
unsigned int size = sizeof(buf);

for (unsigned int i = 0; i < 5; ++i)
{
 char *ptr = data + size;
 size += sizeof(buf);
 char *tmp = (char*)realloc(data, size);
 if (!tmp)
 {
  std::cout << "Oh no..";
  break;
 }
 data = tmp;
 memcpy(ptr, buf, sizeof(buf));
}

free(data);

Спасибо!

Это было полезно?

Решение

Вы разбиваете кучу. realloc может свободно выбрать, чтобы вернуть вам память из совершенно другого местоположения по мере перераспределения, и это аннулирует вашу ptr. Анкет Установлен ptr После перераспределения.

Другие советы

На второй итерации петли вот значения

  • data указывает на буфер размера sizeof(buf)
  • size имеет ценность sizeof(buf)

Учитывая эти значения значения ptr это то, что он указывает на конец буфера, выделенного на data. Анкет Это память не принадлежит процессу и следующему memcpy Операция записывает это и повреждает память.

char *ptr = data + size;
char *tmp = (char*)realloc(data, size);
memcpy(ptr, buf, sizeof(buf));

Призыв к realloc() Здесь потенциально может освободить старый буфер, прежде чем вернуть новый.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top