最新消息:本站技术交流 QQ 群:28124927

理解内存分配

C/C++ exchen 3441浏览

理解内存分配

动态分配内存的函数常见的有 malloc、valloc、calloc、realloc、alloca 这几个,它们之间有什么区别呢?来看看这几个函数的原型:

malloc 函数只有一个参数,即要分配的内存空间的大小。分配完内存后,里面的数据可能会是垃圾数据。

calloc 函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。分配完内存后,里面的数据都是空的。

编写一段测试代码:

在调试器里查看,可以看到指针 p 地址的数据会是随机的垃圾数据,而指针 p2 地址的数据是清空的。

valloc 函数只有一个参数,即要分配的内存空间的大小,但是与 malloc 的区别是 valloc 分配的内存空间大小会是对齐的,如果是 32 位系统就是 8 字节对齐,大小是 8 的倍数,如果是 64 位系统就是 16 字节对齐,大小是 16 的倍数。

realloc 函数是用于重新分配内存空间,实际代码如下:

使用前面的函数分配的内存,都是在堆中,在不使用时需要调用 free 进行释放,如果不释放会造成内存泄露,系统认为这块内存空间一直在使用中,下次再调用 malloc 分配内存时,就会在其他地址分配,但是内存是有限的,如果一直申请分配内存,但是没有释放,内存不够进程就会死掉。

而 alloca 函数是在栈里分配的内存,当 fun 执行完成后,栈里的数据会自动被回收。

转载请注明:exchen's blog » 理解内存分配