两次指针自由调用

Joe*_*Joe 15 c malloc free pointers dynamic-memory-allocation

我在讲座中被教过,free()两次拨打指针真是非常糟糕.我知道NULL在释放它之后立即设置指针是一种很好的做法.

但是,我仍然没有听到任何解释为什么会这样.根据我的理解,方式malloc()有效,它应该在技术上跟踪它已经分配的指针并让你使用.那么为什么它不知道它接收到的指针是否free()已被释放?

当你打电话free()给以前已经被释放的位置时,我很乐意理解,内部会发生什么.

enr*_*cis 19

当你使用时,malloc你告诉PC你想要在堆上保留一些内存位置.计算机返回指向寻址空间的第一个字节的指针.

当您使用时,free您实际上正在告诉计算机您不再需要该空间,因此它将该空间标记为可用于其他数据.

指针仍然指向该内存地址.此时,另一个malloc调用可以返回堆中的相同空间.当您free第二次调用时,您不会释放以前的数据,而是释放新数据,这可能不适合您的程序;)


Sou*_*osh 5

回答你的第一个问题,

那么为什么它不知道它接收到的指针是否free()已经被释放呢?

因为,malloc()C 标准中的规范并未强制执行此操作。当您打电话malloc()或家庭的功能,它的作用是返回你一个指针,它的内部存储分配的内存位置的大小,该指针。这就是free()不需要大小来清理内存的原因。

此外,一旦free()-d,实际分配的内存会发生什么仍然取决于实现。调用free()只是一个标记,指出分配的内存不再被进程使用,如果需要,可以回收和重新分配。因此,在那时跟踪分配的指针是非常没有必要的。保留所有回溯对操作系统来说是不必要的负担。

然而,出于调试目的,一些库实现可以为您完成这项工作,例如 DUMA 或 dmalloc,最后但并非最不重要的是,来自 Valgrind 的 memcheck 工具。

现在,从技术上讲C如果您调用free()已释放的指针,则该标准不会指定任何行为。这是未定义的行为

C11,第 7.22.3.3 章,free()功能

[...] 如果参数与之前由内存管理函数返回的指针不匹配,或者如果空间已通过调用free()或释放realloc(),则行为未定义。