molloc函数c++申请内存空间_内存的申请与释放
编写 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,siz 下⾯是这段代码的运⾏结果:
可以看到,在使⽤ 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 函数不仅可以进⾏清零操作,还可以⽤来为新申请的内存进⾏初始化。它是对较⼤的结构体或数组进⾏清零操作的⼀种最快⽅法。
以上介绍的各种申请内存空间的函数都有其适⽤的场景,请读者根据合适的情况进⾏选择,不必要⼀定使⽤ malloc 函数。⽆论是什么时
候,都不要忘记释放掉申请的内存哦,即便是程序⾮常短,申请的空间很⼩,也要养成⼀个好习惯。俗话说,“好借好还,再借不难。”如
果⼀直赖着不还的话,系统就会崩溃了hhh。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论