enr*_*cis 19
当你使用时,malloc你告诉PC你想要在堆上保留一些内存位置.计算机返回指向寻址空间的第一个字节的指针.
当您使用时,free您实际上正在告诉计算机您不再需要该空间,因此它将该空间标记为可用于其他数据.
指针仍然指向该内存地址.此时,另一个malloc调用可以返回堆中的相同空间.当您free第二次调用时,您不会释放以前的数据,而是释放新数据,这可能不适合您的程序;)
回答你的第一个问题,
那么为什么它不知道它接收到的指针是否
free()已经被释放呢?
因为,malloc()C 标准中的规范并未强制执行此操作。当您打电话malloc()或家庭的功能,它的作用是返回你一个指针,它的内部存储分配的内存位置的大小,在该指针。这就是free()不需要大小来清理内存的原因。
此外,一旦free()-d,实际分配的内存会发生什么仍然取决于实现。调用free()只是一个标记,指出分配的内存不再被进程使用,如果需要,可以回收和重新分配。因此,在那时跟踪分配的指针是非常没有必要的。保留所有回溯对操作系统来说是不必要的负担。
然而,出于调试目的,一些库实现可以为您完成这项工作,例如 DUMA 或 dmalloc,最后但并非最不重要的是,来自 Valgrind 的 memcheck 工具。
现在,从技术上讲,C如果您调用free()已释放的指针,则该标准不会指定任何行为。这是未定义的行为。
C11,第 7.22.3.3 章,free()功能
[...] 如果参数与之前由内存管理函数返回的指针不匹配,或者如果空间已通过调用
free()或释放realloc(),则行为未定义。