malloc和free使用
基本定义和函数原型
基本定义
学习C/C++的都或多或少听说过malloc和free这两个函数吧,这两个函数是C/C++语言中用于动态分配内存和释放的函数,malloc可以向操作系统申请一定量的内存,具体申请多大的内存由参数指定,而free则是用来释放由malloc申请到的内存。malloc动态申请的内存主要来自于进程地址空间的堆区,每个进程在创建并运行的过程中,操作系统会为其分配地址空间,这个地址空间是虚拟地址空间,在32位Linux系统中一般是4GB,其中3GB是用户地址空间,1GB是内核空间,malloc申请的内存空间位于用户地址空间中的堆区。由于C/C++不支持自动垃圾回收机制,所以由malloc动态申请的内存必须由用户自己释放(归还给进程或者操作系统),在程序中我们可以使用free函数来实现对内存的回收。
函数原型
malloc和free函数的原型定义在C标准库的stdlib.h头文件中,要使用这两个函数必须先包含这个头文件,否则编译会出错,在C++程序中一般是写成#include<cstdlib>
。
malloc原型
1 | void* malloc(long size); |
free原型
1 | void free(void * pointer) |
使用实例
1 |
|
从上述代码可以看出,malloc在分配内存时如果成功返回的是一个无类型指针,在使用之前需要对其进行强制类型转换,并且在分配之后需要对指针进行判空。在程序结束时,我们需要手动使用free函数进行释放,并且需要将指针变量设置为空指针,防止出现野指针而引起程序崩溃。
使用陷阱
- malloc和free函数应该配对使用,有分配就一定有释放,否则会造成内存泄漏,并且对某块内存只能释放一次,如果释放多次会使程序运行出错,从而引起程序崩溃,因此在程序中禁止对已经释放过的内存进行释放。
- 当申请的内存不再需要时,应该对其进行释放,释放之后应该要将指向该内存的所有指针置空,防止出现野指针。并且,已经释放的内存不能再次被访问,除非被重新分配,否则会引起段错误。
- malloc 申请内存可能会失败,在使用之前必须先检查是否可用,避免访问NULL指针而引起错误。