malloc和free的使用

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
#include<stdlib.h>
int main(){
char *p;
p=(char*)malloc(10);
if(p == NULL) //必须判断是否分配成功
cout << "Not enougth memory" << endl;
else
cout << "allocated at" << p << endl
//此处可以进行对已分配内存的操作
if(p!=NULL){
free(p); //回收内存
p = NULL; //注意要让指针置空,防止出现野指针
}
return 0;
}

从上述代码可以看出,malloc在分配内存时如果成功返回的是一个无类型指针,在使用之前需要对其进行强制类型转换,并且在分配之后需要对指针进行判空。在程序结束时,我们需要手动使用free函数进行释放,并且需要将指针变量设置为空指针,防止出现野指针而引起程序崩溃。

使用陷阱

  • malloc和free函数应该配对使用,有分配就一定有释放,否则会造成内存泄漏,并且对某块内存只能释放一次,如果释放多次会使程序运行出错,从而引起程序崩溃,因此在程序中禁止对已经释放过的内存进行释放。
  • 当申请的内存不再需要时,应该对其进行释放,释放之后应该要将指向该内存的所有指针置空,防止出现野指针。并且,已经释放的内存不能再次被访问,除非被重新分配,否则会引起段错误。
  • malloc 申请内存可能会失败,在使用之前必须先检查是否可用,避免访问NULL指针而引起错误。