0

当我在这部分代码中释放内存时......我收到一个错误,显示为 :free(): invalid next size (fast)

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;

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

4

4 回答 4

5

dataPage->data如果条目超出边界,您可能会得到这个。这个结构条目只有一个字节长,所以除非slot.slotaddress==0and recordSize==1,否则你将写入datapage struct. 这种内存损坏可能是导致您的free错误的原因。

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

valgrind progname args

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

于 2012-11-05T20:01:21.747 回答
3

您几乎可以肯定在您分配的结构的末尾写入,很可能是在写入data[]成员时,该成员只有足够的空间容纳一个元素。(任何大于 0 的索引都将超过分配的内存,并可能覆盖已分配块的元数据。)

如果你喜欢在 stackoverflow 上获得帮助,我强烈建议你开始接受一些给你的答案。

于 2012-11-05T19:59:40.597 回答
2

您的错误可能在此代码片段之外。我强烈建议用gcc -Wall -g(在 Linux 上)编译你的所有程序,改进代码直到没有给出警告,并使用gdbvalgrind调试你的程序。

如果您在其他系统上,请尝试在编译期间启用所有警告和调试信息,并使用内存泄漏检测器。

于 2012-11-05T19:59:43.233 回答
2

我正在查看您的 memcpy() 行: memcpy(&dataPage->data[slot.slotaddress],record,recordSize);

这是该功能的用法:
void *memcpy(void *dest, const void *src, size_t n);

第一个参数是目的地:&dataPage->data[slot.slotaddress] 对我来说,这表明您要求它存储数据,从dataPage->data您分配的结构部分开始,因此您基本上是在覆盖您的数据并通过它进入 la-la 土地。

于 2012-11-05T20:06:11.023 回答