Я только что столкнулся с проблемой free(): invalid next size (fast)
при написании программы на C ++. И я не смог понять, почему это может произойти, к сожалению. Код приведен ниже.
bool not_corrupt(struct packet *pkt, int size)
{
if (!size) return false;
bool result = true;
char *exp_checksum = (char*)malloc(size * sizeof(char));
char *rec_checksum = (char*)malloc(size * sizeof(char));
char *rec_data = (char*)malloc(size * sizeof(char));
//memcpy(rec_checksum, pkt->data+HEADER_SIZE+SEQ_SIZE+DATA_SIZE, size);
//memcpy(rec_data, pkt->data+HEADER_SIZE+SEQ_SIZE, size);
for (int i = 0; i < size; i++) {
rec_checksum[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+DATA_SIZE+i];
rec_data[i] = pkt->data[HEADER_SIZE+SEQ_SIZE+i];
}
do_checksum(exp_checksum, rec_data, DATA_SIZE);
for (int i = 0; i < size; i++) {
if (exp_checksum[i] != rec_checksum[i]) {
result = false;
break;
}
}
free(exp_checksum);
free(rec_checksum);
free(rec_data);
return result;
}
Используются макросы:
#define RDT_PKTSIZE 128
#define SEQ_SIZE 4
#define HEADER_SIZE 1
#define DATA_SIZE ((RDT_PKTSIZE - HEADER_SIZE - SEQ_SIZE) / 2)
Используемая структура:
struct packet {
char data[RDT_PKTSIZE];
};
Этот кусок кода не ошибается каждый раз. Это может произойти сбой с free(): invalid next size (fast)
иногда в free(exp_checksum);
части.
Что еще хуже, иногда то, что в rec_checksum
, просто не совпадает с тем, что в pkt->data[HEADER_SIZE+SEQ_SIZE+DATA_SIZE]
, что должно быть одинаковым в соответствии с выражениями часов из моих инструментов отладки. Используются оба метода: memcpy
и for
, но эта проблема остается.
Я не совсем понимаю, почему это произошло. Я был бы очень благодарен, если бы кто-нибудь мог мне это объяснить.
Изменить:
Вот метод do_checksum (), который очень прост:
void do_checksum(char* checksum, char* data, int size)
{
for (int i = 0; i < size; i++)
{
checksum[i] = ~data[i];
}
}
Редактировать 2:
Спасибо за все.
Я переключил другую часть своего кода с использования очереди STL на вектор STL, тогда результаты получаются крутыми.
Но все же я не понял, почему. Я уверен, что я никогда не вытолкну пустую очередь.