程序结束后,malloc申请的内存会被释放掉吗

1,有这么一个问题,下面这段程序执行完毕后,malloc的内存会释放吗?

int main () {
  int *p = malloc(10 * sizeof *p);
  *p = 42;
  return 0;  //Exiting without freeing the allocated memory
}

  这段程序运行完后,p 申请的malloc地址会被释放掉吗? 会的。

The Linux Programming Interface书中有这么一段:

When a process terminates, all of its memory is returned to the system, including heap memory allocated by functions in the malloc package. In programs that allocate memory and continue using it until program termination, it is common to omit calls to free(), relying on this behavior to automatically free the memory.  This can be especially useful in programs that allocate many blocks of memory, since adding multiple calls to free() could be expensive in terms of CPU time, as well as perhaps being complicated to code.
 

2,分析

每一个进程都运行在一个独立的4GB“地址空间”当中
这个4G只是逻辑上的,物理内存不可能有这么多,
这个“地址空间”中,内核占掉了高位的2G, 用户就用低位的2G 了,用malloc 来管理
在用户程序的堆中分配一个指定大小的空间,并告诉系统的内存管理模块:“我要使用这块空间!”
那么,系统的内存管理模块究竟做了些什么呢?
熟悉Intel 80x86编程的人应该容易理解,它其实只做一件事:把应用程序的虚拟地址空间映射到真实的物理地址(或者磁盘上的分页文件)
所以说,不管用户程序怎么malloc,在进程结束的时候,其虚拟地址空间就会被直接销毁,操作系统只需要在进程结束的时候
让内存管理模块把分页文件中与此进程相关的记录全部删除,标记为“可用空间”,
就可以使所有申请的内存都一次性地回收,根本没有什么麻烦.

简单说,malloc 的分配都是假的,malloc 的请求系统都知道,程序退出时,系统会回收malloc 的所有资源
 

3,free后指针怎么办?

    别看 free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
    用调试器跟踪示例程序,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“悬空指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。
    如果程序比较长,我们有时记不住p 所指的内存是否已经被释放,在继续使用p 之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if 语句起不到防错作用,因为即便p 不是NULL 指针,它也不指向合法的内存块。
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p); // p 所指的内存被释放,但是p 所指的地址仍然不变,指针值还是那个地址,但已经不指向它了,再赋值会出错。

if(p != NULL) // 没有起到防错作用
{
strcpy(p, “world”); // 出错
}

 

野指针:未初始化的指针;

悬空指针:free后,未置空的指针。

https://www.cnblogs.com/idorax/p/6475941.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章