【问题标题】:free() not freeing up memory properly?free() 没有正确释放内存?
【发布时间】:2010-02-21 12:48:16
【问题描述】:

我正在尝试释放使用malloc 分配的内存,但根据Eclipse 的调试器,free 命令似乎无法正常工作。这怎么可能?

下面是我的调试器在释放seCurrent->student->year 后的屏幕截图,显然情况并非如此。 year 是使用 malloc 分配的。

alt text http://img693.imageshack.us/img693/7840/codeo.png

【问题讨论】:

    标签: c memory-leaks free malloc


    【解决方案1】:

    free() 通常不会更改程序中的任何值 - 它只是对 C 运行时堆进行调整。这意味着内存中刚刚释放的值将被保留。但是,尝试从您的代码中访问它们会导致未定义的行为。

    【讨论】:

    • @Pieter 将其设置为无效的、可被人类识别为无效且不被free 接受的内容。标准规定free 应该接受NULL,因此如果将指针设置为NULL,则可能会隐藏双重释放错误。
    • 另一方面,如果将指针设置为NULL,然后再次释放它,这真的是一个错误吗?
    • @bk1e: 再次释放它不是一个错误,但如果你的程序做到了,而你(程序员)没有意识到它会这样做,那么这意味着你不理解你的自己的程序。这种情况与包含错误的程序密切相关 :-) 当然,您可以编造一些情况,您知道程序可能会或可能不会释放 null,并且不在乎哪个,但 Pascal 正在谈论您的情况意外双免。将指针归零可以防止未定义的行为,但仅仅因为你躲过了一颗子弹并不意味着你的 bug 只发射了一颗。
    • 不过,这已经在 SO 上讨论过几次。据我所知,总结:将所有释放的指针归零的策略有一些优点。不要将它们归零,除非 NULL 在这种情况下意味着某些东西有一些优势。有些人相当强烈地认为一组优势胜过另一组。
    【解决方案2】:

    是什么让你认为它没有释放它?释放内存意味着此后从程序中访问它是未定义的行为,并且下次调用 malloc 时可以重新使用内存。它不承诺覆盖存储在您释放的内存中的数据,或阻止调试器读取未分配的内存。

    【讨论】:

      【解决方案3】:

      Free 会将分配的空间返回给堆以供后续 malloc 重用,但它不会更改先前引用该内存的任何指针的值。在您的情况下,尚未执行其他 malloc,因此刚刚释放的内存仍与调用 free 之前相同。为了让您的代码知道不再有任何与指针关联的数据,您可能需要在释放与其关联的内存后将其设置为null

      【讨论】:

        【解决方案4】:

        当您malloc() 一些内存时,它所做的只是在内存中搜索一些空闲空间,并跟踪它现在已被使用。它不会初始化它或其他任何东西。

        当您调用free() 时,它所做的只是将该内存块从已用内存块列表中清除。同样它不会修改内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-16
          • 2012-05-15
          • 1970-01-01
          • 2017-12-26
          • 2011-07-18
          • 2011-05-31
          • 1970-01-01
          相关资源
          最近更新 更多