堆和栈的对比:
栈(操作系统):由自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
栈使用的是, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。结构特点,先进先出。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
申请限制:
栈:在Windows下,栈是向低地址扩展的,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的,是不连续的内存区域。这是由于系统是用来存储的空闲的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于中有效的。由此可见,堆获得的空间比较灵活,也比较大。
存储内容:
栈: 在调用时,在大多数的C中,参数是由右往左入栈的,然后是函数中的。注意是不入栈的。当本次结束后,先,然后是参数,最后栈顶指向最开始存的地址,也就是中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。malloc()到的内存就属于堆中的。
free()函数:
功 能: 与malloc()配对使用,释放malloc函数申请的。
用 法: void (void *ptr);
malloc()函数:
原型:extern void *malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存块
返回值:如果分配成功则返回指向被分配内存的(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用()函数将内存块释放。
malloc()与free()工作机制:
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲。调用malloc函数时,它沿寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用函数时,它将用户释放的内存块连接到空闲链上。
到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
现在有一个问题:如果一个程序malloc了一块儿内存之后,不使用free()释放,当程序退出后,系统是否会自动回收那一部分内存?
本想实验一下,正在想办法。
阅读(1013) | 评论(0) | 转发(0) |