【问题标题】:Error on calling free: double free or corruption, corrupted size vs. prev_size, received signal 6调用免费时出错:双重免费或损坏,损坏的大小与 prev_size,收到信号 6
【发布时间】:2021-10-23 23:36:53
【问题描述】:

在分配的内存块上调用 free 时收到错误消息。 根据我的代码,我得出以下 MWE

(注意,那个free被注释掉了,如果被调用,就会报错。)

#include <stdio.h>
#include <malloc.h>

typedef struct foo1 {
    double v1;
    double v2;
    double v3;
} foo1;

typedef struct foo2 {
    foo1* myfoo1s;
    int num_foo1;
} foo2;

void init_and_set_v1(foo2** myfoo2, int a_num){
    *myfoo2 = malloc(sizeof(foo2));
    (*myfoo2)->num_foo1 = a_num;
    (*myfoo2)->myfoo1s = malloc( (*myfoo2)->num_foo1 * sizeof(foo2) );
    for(int i = 0; i < (*myfoo2)->num_foo1; i ++){
        (*myfoo2)->myfoo1s[i].v1 = 1.0;
    }
    //free( (*myfoo2) -> myfoo1s); //location 1
}

void set_v2_and_v3(foo2* myfoo2){
    for(int i = 0; i < myfoo2->num_foo1; i ++){
        myfoo2->myfoo1s[i].v2 = 2.0;
        myfoo2->myfoo1s[i].v3 = 3.0;
    }
    //free(myfoo2->myfoo1s); //location 2
}

int main(){
   foo2* myfoo2;
   init_and_set_v1(&myfoo2, 10);
   set_v2_and_v3(myfoo2);
   printf("%d\n", myfoo2->num_foo1);
   // ... do other things
   //free(myfoo2->myfoo1s); //location 3
   printf("done.");
   return 0;
}

我有一个结构 foo2,它包含一个指向结构数组 foo1 的指针。我使用不同的函数分配内存和初始化变量,因为在我的用例中,我需要解析不同的数据文件。我不想有一个巨大的代码块。

但是,当我拨打免费电话时,我收到一个错误消息。我使用 GCC 7.5.0。 对于可能导致此问题的原因,我将不胜感激。

附:在我的原始程序中,错误取决于调用 free 的位置。在这个 MWE 中,它不是。

非常感谢。

【问题讨论】:

  • 此行包含错误:(*myfoo2)-&gt;myfoo1s = malloc( (*myfoo2)-&gt;num_foo1 * sizeof(foo2) );(即:应为sizeof(foo1))。
  • @LucaPolito 非常感谢。在我的原始代码中,类似的错误可能会导致错误。更改线路修复它。如果你快写答案,我会接受的。
  • 别担心,你可以接受dbush的回答。
  • @LucaPolito 我希望这可以为您提供一个教训,即意义命名很重要。 foo1 可以很容易地与foo2 混合使用。
  • @LucaPolito 好的,谢谢。

标签: c malloc free


【解决方案1】:

您分配了错误的内存量:

(*myfoo2)->myfoo1s = malloc( (*myfoo2)->num_foo1 * sizeof(foo2) );

您想创建一个foo1 数组,但您在此处使用sizeof(foo2)foo2 数组分配空间。由于foo2 小于foo1,因此您在分配内存触发undefined behavior 结束后写入

将其更改为:

(*myfoo2)->myfoo1s = malloc( (*myfoo2)->num_foo1 * sizeof(foo1) );

并且在您完成使用它之前之后不要调用free,在这种情况下,“位置 3”是您想要释放 myfoo2-&gt;myfoo1smyfoo2 的位置。

【讨论】:

    【解决方案2】:

    附:我在原始代码中找到了问题的根本原因——独立于 MWE。该错误是由两次释放分配的内存引起的。在进一步追踪问题后,GCC 打印了错误 free(): double free detected in tcache 2,这让我走上了正轨。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多