C和C++中都可以使用malloc、calloc、realloc三个库函数来在堆区动态开辟出一段内存块。并都可以用free()函数来释放掉开辟出来的内存,以便后续使用,避免造成内存泄漏(memory leak)。
调用三个函数必须包含头文件 < stdlib.h >
malloc函数 原型为 void* malloc(size_t size )。开辟一块连续的大小为size字节的空间。void *返回值表示试用于任何的数据类型。
例如:
int * p1 = (int * )malloc(sizeof(int)* 10);
开辟出40字节的空间,并返回首地址给p1,强制类型转换为 int *。
但不能随意修改开辟出来的内存块以外的值。
这里给P1开辟了10个int大小的空间,但访问了p1[10]不属于该空间,系统崩溃。
calloc 函数也用于分配动态空间。在分配好空间的时候初始化该空间中的值为0.
原型为 void * calloc (size_t n,size_t size )。两个参数分别是 n为要初始化的变量个数 size是要初始化的变量大小。
例如:
int * p2 =(int * )calloc (10, sizeof ( int ));
两者的区别是:malloc开辟出来的空间里存放的是随机值。而calloc里面默认初始化为0。
图中的p1 和p2 分别指向的空间内存放的值。p1为随机值 p2里为0。
realloc 函数 功能是扩容,重新分配内存空间。
realloc
Reallocate memory blocks.
函数原型 void *realloc( void *memblock, size_t size );
当第一个参数 指针为NULL的时候 该函数和malloc函数一模一样。
如果不为空。它会从该指针后开始找size大小的空间进行开辟,如果未找到相应大小的内存块,则在其他地方找想要的大小的内存块,并把以前开辟出的内存块里的内容进行Copy。最后返回新内存块的首地址。
★内存泄漏如何检测
“该死的内存泄漏问题“,系统长时间运行之后会出现内存越来越少的现象,内存泄漏是常见的难以发现的问题。
内存泄漏是疏忽或错误造成的系统未能释放已经不再使用的内存,并非是指内存在物理上的消失.而是程序设计错误,导致释放内存之前就失去了对该内存块的控制导致的内存浪费。
windows系统下VS调试器CRT库为我们提供了一个检测内存泄漏的有效方法,原理是:内存分配要通过CRT运行时实现,只要在分配和释放时分别做好标记就可以检测出来是否有内存释放。
#include<stdlib.h>
#include<stdio.h>
#include<crtdbg.h>
#define _CRTDBG_MAP_ALLOC
int main()
{
int *p1 = (int *)malloc(sizeof(int)* 10);
int *p2 = (int *)calloc(10, sizeof(int));
if (p1 == NULL)
printf("out of memory!\n");
//free(p1);
//free(p2);
if(_CrtDumpMemoryLeaks())
printf("memory leak!!!! \n");
else
printf("not found memory leak.\n");
return 0;
}
以上程序为free释放内存,则会打印出来”memory leak!!!!“,
但如果加上free释放会打印not found memory leak.