编写 C/C++ 程序时,经常需要申请内存,内存的申请与释放也是在编写程序中最需要注意的地方。和 Python 等程序不同的是,C/C++ 将内存的申请与释放的权限交给了程序员,如果程序员忘记了释放已经申请的内存,那么在程序运行结束前它会一直占据这个空间。随着程序的运行,有可能会占据的内存越来越多,最终导致系统崩溃。因此每次申请内存的时候,都不要忘记在合适的地方释放掉。本文主要介绍申请内存的几种方法,这些不同的方法各有其适用的场景,读者可以根据自己的实际情况进行选择。
首先是 malloc 函数,该函数的原型是 void *malloc(size_t size); 功能是分配 size 字节的未初始化内存块,如果成功分配,则返回数组的地址,否则返回 NULL。这个函数对于大部分程序员来说都是比较熟悉的,需要特别注意的有两点:第一点是该函数的返回值是 void * 类型,因此对于特定的数据类型,需要进行强制类型转换;第二点是这个函数只负责分配内存,并不会进行初始化操作,因此不可以直接引用内存块的值。
然后是 realloc 函数,该函数的原型是 void *realloc(void *ptr, size_t size); 函数功能是将 ptr 指向的内存块大小改为 size 字节,但是内存块内原来的数据都不会发生变化,新增加的内存块仍然是未被初始化的。
还有 calloc 函数,该函数的原型是 void *calloc(size_t nmem, size_t size); 函数的功能是为含有 nmem 个成员的数组分配空间,每个元素占 size 字节大。和前面两个函数不同的是,该函数可以将每个内存块初始化为0。
最后是 new 运算符,它在 C++ 程序中经常被使用。相比于前面几种申请内存的方法,使用 new 运算符不需要进行强制类型转换。在使用完这段内存空间之后,需要使用 delete 运算符将其释放掉。
下面通过一段程序来看一下它们的具体使用方法:
#include#include#includeusing namespace std;int main(){ int *a,*b; int i; a=(int *)malloc(sizeof(int)*4); assert(a); for (i=0;i<4;i++) a[i]=i+1; a=(int *)realloc(a,sizeof(int)*6); a[4]=5; a[5]=6; for (i=0;i<6;i++) cout<<"a["<"]="< cout<<endl; free(a); a=(int *)calloc(4,sizeof(int)); assert(a); for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; free(a); b=new int[4]; for (i=0;i<4;i++) b[i]=(i+1)*(i+1); for (i=0;i<4;i++) cout<<"b["<"]="< cout<<endl; delete []b;}
下面是这段代码的运行结果:
可以看到,在使用 calloc 函数申请内存之后,每个数组成员的值都被设置为了0。因此为了避免引用未初始化的内存块,建议使用 calloc 函数。
有时候,需要对一个数组进行清零操作,常规的方法是使用循环,然后在循环内部进行赋值。但是当循环次数过多的时候,效率就比较低了。可以使用 memset 函数实现这一操作,该函数的原型是 void *memset(void *s, int ch, size_t n); ch 即是要初始化的值,n 是这段内存空间的大小。由于该函数存在于 string.h 头文件中,因此只有包含了这个头文件才可以使用这个函数。通过下面的程序了解下它的用法:
#include#include#includeusing namespace std;int main(){ int *a; int i; a=new int[4]; for (i=0;i<4;i++) a[i]=i+1; for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; memset(a,0,sizeof(int)*4); for (i=0;i<4;i++) cout<<"a["<"]="< cout<<endl; delete []a;}
下面是这段程序的运行结果:
memset 函数不仅可以进行清零操作,还可以用来为新申请的内存进行初始化。它是对较大的结构体或数组进行清零操作的一种最快方法。
以上介绍的各种申请内存空间的函数都有其适用的场景,请读者根据合适的情况进行选择,不必要一定使用 malloc 函数。无论是什么时候,都不要忘记释放掉申请的内存哦,即便是程序非常短,申请的空间很小,也要养成一个好习惯。俗话说,“好借好还,再借不难。”如果一直赖着不还的话,系统就会崩溃了hhh。