错误:free():下一个大小无效(快)

Roh*_*hit 0 c free struct memcpy data-structures

当我在这部分代码中释放我的记忆时...我收到一个错误显示为: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;
}
Run Code Online (Sandbox Code Playgroud)

执行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;
Run Code Online (Sandbox Code Playgroud)

我在memcpy之前保持free(dataPage)它工作正常但是在memcpy之后它没有工作..并显示错误....任何人都可以帮助我解决这个问题...

ama*_*rea 5

如果是dataPage->data条目,你可能会因为在边界外写作而得到这个.这个结构条目只是一个字节长,所以除非slot.slotaddress==0recordSize==1,你将写入结束后的任何内存datapage struct.这种内存损坏可能是导致free错误的原因.

要追踪此类错误,我建议您通过valgrind以下方式运行程序:

valgrind progname args
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能会收到有关"无效写入"的消息,这些消息会告诉您正在写入数组边界之外.