为什么我可以释放内存两次,但是在不同情况下却不能呢?

狼_t

这是我目前拥有的代码。

int main() {
    double *t, *k;
    Item *a = calloc(1, sizeof(Item));
    a->w = malloc(sizeof(double));
    t = a->w;
    k = t;
    free(a->w);
    free(a);
    free(k);
    return 0;
}

在此示例中,我能够编译并运行而没有任何显式错误。但是,如果我在释放结构a之前释放了指针k,那么我会收到一个双重的free / heap损坏错误。

free(a->w);
free(k);
free(a);

此外,如果执行以下操作,则会收到相同的错误:

free(k);
free(a->w);
free(a);

为什么在释放结构k之后没有任何显式错误的情况下我可以释放指针k,但是在释放结构a之前我不能释放内存k指向两次?

dbush

这是未定义行为的示例这意味着可能发生任何事情,例如看起来正常工作,立即崩溃,稍后崩溃,奇怪的意外行为或经常提到的鼻恶魔

手册页

free()释放ptr指向的内存空间,该内存空间必须已由先前对malloc(),calloc()或realloc()的调用返回。否则,或者如果之前已经调用过free(ptr),则会发生未定义的行为如果ptr为NULL,则不执行任何操作。

因此可能会触发双重释放错误,但这不是必需的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们可以重定向“ less”命令的输入,但是却不能在没有任何参数的情况下减少运行?

来自分类Dev

为什么我可以在不声明C的情况下在C中调用函数,而在C ++中却不能呢?

来自分类Dev

为什么ArrayLists可以存储不同的对象,而数组却不能呢?

来自分类Dev

为什么Visual Studio在没有优化的情况下可以正确编译此函数,而在优化的情况下却不能正确编译?

来自分类Dev

为什么这种方式可以正确返回我的对象的实例,但是这种方式却不能

来自分类Dev

为什么我可以进场却不能进场?

来自分类Dev

Switch语句:为什么在不同情况下我不能拥有相同的变量名?爪哇

来自分类Dev

Switch语句:为什么在不同情况下我不能使用相同的变量名?爪哇

来自分类Dev

为什么在不同的情况下Jackson会两次映射这些值?

来自分类Dev

为什么在编译时,伴随对象可以在其伴随类中访问私有val,但是在解释时却不能这样做?

来自分类Dev

为什么foldr可以在Haskell中的无限列表上工作,而foldl却不能呢?

来自分类Dev

在这种情况下,为什么必须单击两次才能加载我的图像?

来自分类Dev

为什么我可以更改高度溢出的图像的宽度,而我却不能更改高度?

来自分类Dev

为什么我的扬声器可以工作,但耳机却不能工作?

来自分类Dev

为什么嵌套的子类可以访问其父类的私有成员,但子孙却不能呢?

来自分类Dev

为什么C ++中的void方法可以返回void值,而在其他语言中却不能呢?

来自分类Dev

为什么作为功能的Angular控制器可以工作,而封装中的控制器却不能工作呢?

来自分类Dev

为什么我的Erlang引导脚本可以从控制台运行,但是从init系统(sysvinit,upstart,systemd)运行时却不能运行?

来自分类Dev

为什么我可以用智能来修复损坏的程序包,但是却不能用apt-get或synaptic来解决?

来自分类Dev

为什么此脚本可以从命令行运行,但是当我将其放入Windows批处理文件中时却不能运行?

来自分类Dev

为什么AutoHotkey不能将'RCtrl'用作热键,而AutoIt却不能呢?

来自分类Dev

为什么在不同情况下应使用不同数量的转义符?

来自分类Dev

为什么这个constexpr函数在gcc中的不同情况下会给出不同的结果?

来自分类Dev

可以在不同情况下返回compareTo不同结果

来自分类Dev

为什么clang不警告关于从double到int的隐式转换,但是在从long到int的情况下这样做呢?

来自分类Dev

为什么php脚本可以在免费托管上工作,而在我的vps上却不能工作?

来自分类Dev

csv模块=> DictReader类Reader对象:为什么我不能在关闭文件的情况下遍历Reader Object,但是可以访问其属性?

来自分类Dev

为什么有时可以使用NodeJS缓冲区连接音频数据,而有时却不能呢?

来自分类Dev

为什么在FireFox中可以使用脚本控制台编辑DOM,而在IE 11中却不能呢?

Related 相关文章

  1. 1

    为什么我们可以重定向“ less”命令的输入,但是却不能在没有任何参数的情况下减少运行?

  2. 2

    为什么我可以在不声明C的情况下在C中调用函数,而在C ++中却不能呢?

  3. 3

    为什么ArrayLists可以存储不同的对象,而数组却不能呢?

  4. 4

    为什么Visual Studio在没有优化的情况下可以正确编译此函数,而在优化的情况下却不能正确编译?

  5. 5

    为什么这种方式可以正确返回我的对象的实例,但是这种方式却不能

  6. 6

    为什么我可以进场却不能进场?

  7. 7

    Switch语句:为什么在不同情况下我不能拥有相同的变量名?爪哇

  8. 8

    Switch语句:为什么在不同情况下我不能使用相同的变量名?爪哇

  9. 9

    为什么在不同的情况下Jackson会两次映射这些值?

  10. 10

    为什么在编译时,伴随对象可以在其伴随类中访问私有val,但是在解释时却不能这样做?

  11. 11

    为什么foldr可以在Haskell中的无限列表上工作,而foldl却不能呢?

  12. 12

    在这种情况下,为什么必须单击两次才能加载我的图像?

  13. 13

    为什么我可以更改高度溢出的图像的宽度,而我却不能更改高度?

  14. 14

    为什么我的扬声器可以工作,但耳机却不能工作?

  15. 15

    为什么嵌套的子类可以访问其父类的私有成员,但子孙却不能呢?

  16. 16

    为什么C ++中的void方法可以返回void值,而在其他语言中却不能呢?

  17. 17

    为什么作为功能的Angular控制器可以工作,而封装中的控制器却不能工作呢?

  18. 18

    为什么我的Erlang引导脚本可以从控制台运行,但是从init系统(sysvinit,upstart,systemd)运行时却不能运行?

  19. 19

    为什么我可以用智能来修复损坏的程序包,但是却不能用apt-get或synaptic来解决?

  20. 20

    为什么此脚本可以从命令行运行,但是当我将其放入Windows批处理文件中时却不能运行?

  21. 21

    为什么AutoHotkey不能将'RCtrl'用作热键,而AutoIt却不能呢?

  22. 22

    为什么在不同情况下应使用不同数量的转义符?

  23. 23

    为什么这个constexpr函数在gcc中的不同情况下会给出不同的结果?

  24. 24

    可以在不同情况下返回compareTo不同结果

  25. 25

    为什么clang不警告关于从double到int的隐式转换,但是在从long到int的情况下这样做呢?

  26. 26

    为什么php脚本可以在免费托管上工作,而在我的vps上却不能工作?

  27. 27

    csv模块=> DictReader类Reader对象:为什么我不能在关闭文件的情况下遍历Reader Object,但是可以访问其属性?

  28. 28

    为什么有时可以使用NodeJS缓冲区连接音频数据,而有时却不能呢?

  29. 29

    为什么在FireFox中可以使用脚本控制台编辑DOM,而在IE 11中却不能呢?

热门标签

归档