Ошибка: бесплатно (): недопустимый следующий размер (быстро)

Когда я освобождаю свою память в этой части кода... я получаю сообщение об ошибке: :free(): неверный следующий размер (быстро)

int insertRecord(char *record,int recordSize,long dataPageNumber)
{
datapage *dataPage=(datapage *)malloc(sizeof(datapage));
readPage(dataPage,dataPageNumber);

slotentry slot;

//for checking and freeslotnumber storage
int freeSlotNumber=-1;
int negativeFlag=0;
int freeFlag=0;

if(recordSize+sizeof(slotentry)<=dataPage->cfs)
{
    slot.slotsize = recordSize;
    slot.slotaddress = dataPage->cfsptr;
    dataPage->cfs -= (recordSize+sizeof(slotentry));
    dataPage->cfsptr += recordSize;
    dataPage->slotcount++;

    memcpy(&dataPage->data[slot.slotaddress],record,recordSize);

    free(dataPage);
    return 1;
}

После выполнения free(dataPage) я получаю указанную выше ошибку...

typedef struct
{
   int pagenumber;
   int priority;
   long dirPageNo;
   long cfs;
   int cfsptr;
   int slotcount;
   char data[1];
} datapage;

typedef struct
{
   int slotaddress;
   int slotsize;
} slotentry;

Я сохранил бесплатную (dataPage) перед memcpy, она работает нормально, но после memcpy она не работает ... и показывает ошибку .... Может ли кто-нибудь помочь мне в этой проблеме ...


person Rohit    schedule 05.11.2012    source источник
comment
Обратите внимание, что это сообщение об ошибке — отличный пример того, как не нужно писать код, сообщающий об ошибках. Как написано, это имеет смысл только для тех, кто отлаживает внутреннюю реализацию malloc, и в лучшем случае сбивает с толку кого-то вроде OP, чья программа потерпела крах. Хорошо написанное сообщение об ошибке должно сообщать о чем-то вроде фатальной ошибки: это приложение выполнило запись за пределами памяти и повредило внутреннее состояние распределителя памяти.   -  person R.. GitHub STOP HELPING ICE    schedule 06.11.2012


Ответы (4)


Вы, вероятно, получаете это из-за записи вне границ, если запись dataPage->data. Эта запись структуры имеет длину всего один байт, поэтому, если только не slot.slotaddress==0 и recordSize==1, вы будете писать в любую память, расположенную после окончания datapage struct. Это повреждение памяти, вероятно, является причиной вашей ошибки free.

Чтобы отследить этот тип ошибки, я рекомендую запустить вашу программу через valgrind:

valgrind progname args

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

person amaurea    schedule 05.11.2012

Вы почти наверняка пишете за конец выделенной вами структуры, скорее всего, при записи в элемент data[], в котором достаточно места только для одного элемента. (Любой индекс больше 0 будет записываться за пределы выделенной памяти и, вероятно, перезапишет метаданные для выделенного блока.)

И если вам нравится получать помощь по stackoverflow, я настоятельно рекомендую вам начать принимать некоторые из полученных вами ответов.

person Jonathan Wood    schedule 05.11.2012

Ваша ошибка может быть за пределами этого фрагмента кода. Я настоятельно рекомендую скомпилировать всю вашу программу с помощью gcc -Wall -g (в Linux), улучшить код, чтобы предупреждения не выдавались, и использовать gdb и valgrind для отладки вашей программы.

Если вы работаете в другой системе, попробуйте включить все предупреждения и отладочную информацию во время компиляции и использовать детектор утечки памяти.

person Basile Starynkevitch    schedule 05.11.2012

Я смотрю на вашу строку memcpy(): memcpy(&dataPage->data[slot.slotaddress],record,recordSize);

Вот как эта функция используется:
void *memcpy(void *dest, const void *src, size_t n);

Первый аргумент — это место назначения: &dataPage->data[slot.slotaddress] Для меня это означает, что вы просите его сохранить данные, начиная с раздела dataPage->data структуры, которую вы выделили, так что вы в основном перезаписываете свои данные и переходите от них к ля-ля. земля.

person Emo Mosley    schedule 05.11.2012