【问题标题】:C free() function anomaly [closed]C free() 函数异常
【发布时间】:2020-06-27 13:43:10
【问题描述】:

目前我在 C 的动态内存释放函数 free() 中遇到了一个奇怪的现象。简而言之,我有这个结构:

struct person {
    char* name;
    char* address;
    int days[6]; //no work on sundays
};

我已经为这些结构准备了一个容器结构:

struct person* people;

现在,我知道由于我通过 malloc() 动态分配人员的姓名和地址,因此在释放 people 结构之前,我需要相应地 free() 他们。 当我释放名称和地址时,会发生奇怪的遇到行为。如果我只释放两者中的一个,则在取消引用(已经悬空的)指针时会打印出垃圾。 但是,如果我同时释放两者,则不会清除此人的地址,只会清除姓名。 这是我调试sn-p的简单代码:

printf("%s", people[person_counter].name);
printf("%s", people[7].name);
free(people[person_counter].name);
printf("%s", people[person_counter].name);
printf("%s", people[7].name);
//people[person_counter].name = NULL;
printf("%s", people[person_counter].address);
printf("%s", people[7].address);
free(people[person_counter].address);
printf("%s", people[person_counter].address);
printf("%s", people[7].address);

出于调试目的,我硬编码了待释放人员数据在数组中的确切位置。 发生的情况是,前两行在释放后打印出相同的名称,然后打印出垃圾。地址打印在所有 4 个地方都保持不变。比较奇葩的是,如果我注释掉第一个free,地址会打印前两次,后面会被清空。 我理解你不能保证释放后的内存地址的内容不会“和以前一样”,但是这里显然没有释放过程。 由于我真的找不到任何相关信息,因此将不胜感激。

编辑: 我希望这能解决我更复杂的问题,但因为它没有:

我正在做的是从我的容器结构中删除工作人员,使用的简单逻辑是,如果他们不是最后一个工作人员,则最后一个工作人员的姓名和地址(也是工作日)被复制到要删除的工作人员上我总是释放最后一个工人的数据。 我还注意到,当我同时释放姓名和地址时,此人的地址保持不变,但 下一个人的姓名 将是垃圾。 当我打印我的工人名单时可以看到这一点。 这是否也是不确定的,或者当我确定我只释放一次时,如何清除另一个工人的名字,然后是姓名和地址(根据需要)而不是两个名字。

Example Worker1
add1
1

Example Worker2
add2
2

Example Worker8
add8
4

(null)add4
1

Example Worker5
add5
2

Example Worker6
add6
1

Example Worker7
add7
6

我删除 Example Worker3 后的输出,Example Worker8 被复制到它的位置。

【问题讨论】:

  • 这能回答你的问题吗? C - What Happens To Memory After free()?
  • 为什么要取消引用一个已经是freed 的指针?行为未定义。您不能说“显然没有发生释放过程”。它有,不管它看起来是不是这样。
  • 因此,如果我分别释放它们,100% 的时间我会得到垃圾,但如果不这样做,地址将保持不变。
  • 好吧,告诉我“内存的内容将被‘清除’”的地方。
  • 从编辑来看,编码可能有问题。没有足够的帖子可以说,但不太可能是库函数行为不端。

标签: c free


【解决方案1】:

free 不需要清除或覆盖任何内存 - 只需将该内存标记为可用。在free-d 之后尝试引用该内存的行为是未定义;任何结果都是可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2023-01-28
    • 2014-07-06
    • 2011-11-13
    • 2021-04-07
    • 2017-08-16
    • 2012-04-11
    相关资源
    最近更新 更多