2010-06-07 4 views
1

В чем проблема с этим кодом? Он падает каждый раз.несколько вызовов для realloc(), похоже, вызывают кучевое повреждение

Однократно это неудавшееся утверждение «_ASSERTE (_CrtIsValidHeapPointer (pUserData));», в других случаях это всего лишь ошибка «кучка corppuption».

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

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

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); 

Спасибо!

+1

(Извините за редактирование Phantom). Реальный вопрос: почему вы используете realloc на C++? Для этого используется 'std :: vector'. –

+1

На самом деле я пишу класс .. память выпущена в деструкторе, поэтому никакого вреда никогда не бывает. std :: vector слишком тяжел для этой конкретной цели. – Windindeed

+1

Что именно вы видите как «тяжелый» о 'vector'? На самом деле, даже при малейшем уходе он почти всегда будет значительно быстрее *, чем это (возможно, с меньшим кодом). –

ответ

1

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

+0

Yep .. После написания сообщения точно, что попалось мне на глаза ..Я предполагаю, что все, что требуется, чтобы получить ответ, - это написать сообщение .. особенно если вы отлаживаете свое приложение почти на 4 часа, чтобы найти проблему. : D Спасибо! – Windindeed

0

На второй итерации цикла здесь являются значения

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

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

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

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