c++申请内存空间_内存的申请与释放

本文详细介绍了C++中申请内存的几种方法,包括malloc、realloc、calloc以及new运算符,强调了内存释放的重要性。malloc用于分配未初始化的内存,calloc则会将分配的内存初始化为0,realloc可以改变已分配内存的大小。文章还提到了memset函数用于快速初始化内存,并提醒程序员要养成及时释放内存的好习惯,避免内存泄漏导致系统崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写 C/C++ 程序时,经常需要申请内存,内存的申请与释放也是在编写程序中最需要注意的地方。和 Python 等程序不同的是,C/C++ 将内存的申请与释放的权限交给了程序员,如果程序员忘记了释放已经申请的内存,那么在程序运行结束前它会一直占据这个空间。随着程序的运行,有可能会占据的内存越来越多,最终导致系统崩溃。因此每次申请内存的时候,都不要忘记在合适的地方释放掉。本文主要介绍申请内存的几种方法,这些不同的方法各有其适用的场景,读者可以根据自己的实际情况进行选择。

  1. 首先是 malloc 函数,该函数的原型是 void *malloc(size_t size); 功能是分配 size 字节的未初始化内存块,如果成功分配,则返回数组的地址,否则返回 NULL。这个函数对于大部分程序员来说都是比较熟悉的,需要特别注意的有两点:第一点是该函数的返回值是 void * 类型,因此对于特定的数据类型,需要进行强制类型转换;第二点是这个函数只负责分配内存,并不会进行初始化操作,因此不可以直接引用内存块的值。

  2. 然后是 realloc 函数,该函数的原型是 void *realloc(void *ptr, size_t size); 函数功能是将 ptr 指向的内存块大小改为 size 字节,但是内存块内原来的数据都不会发生变化,新增加的内存块仍然是未被初始化的。

  3. 还有 calloc 函数,该函数的原型是 void *calloc(size_t nmem, size_t size); 函数的功能是为含有 nmem 个成员的数组分配空间,每个元素占 size 字节大。和前面两个函数不同的是,该函数可以将每个内存块初始化为0。

  4. 最后是 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;}

下面是这段代码的运行结果:

0b91e8b5ba7c4f01dcb488e6118ee922.png

可以看到,在使用 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;}

下面是这段程序的运行结果:

edd0854b54b9baa9474712b39bf52f14.png

memset 函数不仅可以进行清零操作,还可以用来为新申请的内存进行初始化。它是对较大的结构体或数组进行清零操作的一种最快方法。

以上介绍的各种申请内存空间的函数都有其适用的场景,请读者根据合适的情况进行选择,不必要一定使用 malloc 函数。无论是什么时候,都不要忘记释放掉申请的内存哦,即便是程序非常短,申请的空间很小,也要养成一个好习惯。俗话说,“好借好还,再借不难。”如果一直赖着不还的话,系统就会崩溃了hhh。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值