【发布时间】:2010-02-21 12:48:16
【问题描述】:
我正在尝试释放使用malloc 分配的内存,但根据Eclipse 的调试器,free 命令似乎无法正常工作。这怎么可能?
下面是我的调试器在释放seCurrent->student->year 后的屏幕截图,显然情况并非如此。 year 是使用 malloc 分配的。
【问题讨论】:
标签: c memory-leaks free malloc
我正在尝试释放使用malloc 分配的内存,但根据Eclipse 的调试器,free 命令似乎无法正常工作。这怎么可能?
下面是我的调试器在释放seCurrent->student->year 后的屏幕截图,显然情况并非如此。 year 是使用 malloc 分配的。
【问题讨论】:
标签: c memory-leaks free malloc
free() 通常不会更改程序中的任何值 - 它只是对 C 运行时堆进行调整。这意味着内存中刚刚释放的值将被保留。但是,尝试从您的代码中访问它们会导致未定义的行为。
【讨论】:
free 接受的内容。标准规定free 应该接受NULL,因此如果将指针设置为NULL,则可能会隐藏双重释放错误。
是什么让你认为它没有释放它?释放内存意味着此后从程序中访问它是未定义的行为,并且下次调用 malloc 时可以重新使用内存。它不承诺覆盖存储在您释放的内存中的数据,或阻止调试器读取未分配的内存。
【讨论】:
Free 会将分配的空间返回给堆以供后续 malloc 重用,但它不会更改先前引用该内存的任何指针的值。在您的情况下,尚未执行其他 malloc,因此刚刚释放的内存仍与调用 free 之前相同。为了让您的代码知道不再有任何与指针关联的数据,您可能需要在释放与其关联的内存后将其设置为null。
【讨论】:
当您malloc() 一些内存时,它所做的只是在内存中搜索一些空闲空间,并跟踪它现在已被使用。它不会初始化它或其他任何东西。
当您调用free() 时,它所做的只是将该内存块从已用内存块列表中清除。同样它不会修改内容。
【讨论】: