【问题标题】:Error:free(): invalid next size (fast) [duplicate]错误:free():下一个大小无效(快速)[重复]
【发布时间】:2012-10-25 17:13:10
【问题描述】:

当我在这部分代码中释放内存时...我收到一个错误,显示为 :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 之后它不工作..并显示错误....任何人都可以帮助我解决这个问题...

【问题讨论】:

  • 请注意,此错误消息是如何不编写错误报告代码的一个很好的示例。正如所写的那样,它只对调试malloc 的内部实现的人有意义,并且充其量会让像OP 这样的程序崩溃的人感到困惑。编写良好的错误消息应该报告类似“致命错误:此应用程序执行了越界内存写入并破坏了内存分配器的内部状态”。

标签: c data-structures struct free memcpy


【解决方案1】:

如果dataPage-&gt;data 条目,您可能会因为在边界之外写入而得到这个。这个结构条目只有一个字节长,因此除非slot.slotaddress==0recordSize==1,否则您将写入datapage struct 结束后的任何内存。这个memory corruption 可能是导致您的free 错误的原因。

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

valgrind progname args

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

【讨论】:

    【解决方案2】:

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

    如果您想获得有关 stackoverflow 的帮助,我强烈建议您开始接受一些给您的答案。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-23
          • 2012-05-22
          • 1970-01-01
          • 2017-03-28
          • 2018-05-20
          • 1970-01-01
          • 2015-04-16
          • 1970-01-01
          相关资源
          最近更新 更多