Несколько вызовов в Realloc (), по -видимому, вызывает коррупцию кучи
-
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()
Здесь потенциально может освободить старый буфер, прежде чем вернуть новый.