C中指针上的自由函数是如何工作的?
看看这个C代码:C中指针上的自由函数是如何工作的?,c,pointers,malloc,free,C,Pointers,Malloc,Free,看看这个C代码: #include<stdio.h> #include<stdlib.h> int main(){ int *ptr_one; ptr_one = (int *)malloc(sizeof(int)); if (ptr_one == 0){ printf("ERROR: Out of memory\n"); return 1; } *ptr_one = 25; print
#include<stdio.h>
#include<stdlib.h>
int main(){
int *ptr_one;
ptr_one = (int *)malloc(sizeof(int));
if (ptr_one == 0){
printf("ERROR: Out of memory\n");
return 1;
}
*ptr_one = 25;
printf("%d\n", *ptr_one);
free(ptr_one);
printf("%d\n", *ptr_one);
return 0;
}
即使在我释放指针之后,为什么它仍然给出25作为输出?阅读更多关于(UB)的内容。您的代码有一些错误(在指针被释放后,不允许您使用指针执行某些操作)
即使在我释放指针之后,为什么它仍然给出25作为输出
是UB。你运气不好。是
阅读C11标准规范
您不需要真正了解free
是如何工作的(但您需要了解应该如何使用它)。然而,它通常使用一些特定的处理方法。在上,许多实现(例如GNU或)都是(因此您可以下载并研究它们的源代码),它们的malloc
有时可能通过系统调用(或旧的)获得更多的虚拟地址空间,而它们的free
有时可能会释放一些空间
通常情况下,“大”和“小”内存区域的工作方式不同。对于小区域,C库更愿意在将来重复使用以前的免费-dmalloc
-s。它(有时)从操作系统中获取一大块内存(使用mmap
),并将该内存块分割成若干块。当你释放
一个小区域时,该区域只需添加到一些片段集合中,以便将来malloc
。所以它仍然“存在”,但使用它是UB(这解释了你正在观察的行为)
该实用程序是查找内存相关UB的非常有用的工具。使用free
时发生的唯一事情是告诉操作系统(或类似系统)您承诺不再使用指针。函数free
将指针作为参数,而不是指向指针的指针,因此无法更改指针。@KeineLust:不是内存泄漏,而是未定义的行为。@basilestrynkevich,你说得对,完全误读了这个问题,因为不太可能在两行运行的短时间内重新分配和覆盖大量内存,幸运的是操作系统没有标记进程。无论如何,这是UB,因为你不应该访问释放的内存(它不再属于你的进程)。如此多的精确副本会造成伤害…@RingØ:free
-d内存仍然属于你的进程(例如,它的虚拟地址空间),但你不应该使用它。请看我的答案以获得解释,那么它有什么作用?在那里写自由函数有什么用?你告诉操作系统你已经完成了内存块的处理,所以操作系统可能会将它用于其他用途。
25
25