Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中指针上的自由函数是如何工作的?_C_Pointers_Malloc_Free - Fatal编程技术网

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

看看这个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;
    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库更愿意在将来重复使用以前的
免费
-d
malloc
-s。它(有时)从操作系统中获取一大块内存(使用
mmap
),并将该内存块分割成若干块。当你
释放
一个小区域时,该区域只需添加到一些片段集合中,以便将来
malloc
。所以它仍然“存在”,但使用它是UB(这解释了你正在观察的行为)


该实用程序是查找内存相关UB的非常有用的工具。

使用
free
时发生的唯一事情是告诉操作系统(或类似系统)您承诺不再使用指针。函数
free
将指针作为参数,而不是指向指针的指针,因此无法更改指针。

@KeineLust:不是内存泄漏,而是未定义的行为。@basilestrynkevich,你说得对,完全误读了这个问题,因为不太可能在两行运行的短时间内重新分配和覆盖大量内存,幸运的是操作系统没有标记进程。无论如何,这是UB,因为你不应该访问释放的内存(它不再属于你的进程)。如此多的精确副本会造成伤害…@RingØ:
free
-d内存仍然属于你的进程(例如,它的虚拟地址空间),但你不应该使用它。请看我的答案以获得解释,那么它有什么作用?在那里写自由函数有什么用?你告诉操作系统你已经完成了内存块的处理,所以操作系统可能会将它用于其他用途。
25
25