上述4个函数,都是分配堆上的内存。其中malloc、calloc和realloc是C++/C语言的标准库函数,与free函数配合使用。new是C++ 运算符,与delete配合使用。
(1)malloc函数:void *malloc(unsigned int num_bytes);
(1.1)num_byte:申请的空间大小(单位:字节)。申请的是连续空间,空间内的值随机。
(1.2)返回值:分配成功,返回一个指向分配起始地址的指针;分配失败,返回NULL。申请出的空间基地址需要强制转换为用户想使用的类型。
(1.3)示例:int* p = (int *)malloc(1024);//空间大小1024字节
char* pp = (char *)malloc(1024);//空间大小1024字节
//********************************************************************************************************
(2)calloc函数:void *calloc(size_t n, size_t size);
(2.1)size:申请空间单位,n:申请单位数。申请的是连续空间,空间内的值自动初始化为全0。
(2.2)返回值:分配成功,返回一个指向分配起始地址的指针;分配失败,返回NULL。申请出的空间基地址需要强制转换为用户想使用的类型。
(2.3)示例:int *p = (int *)calloc(16, sizeof(int));//空间大小16*sizeof(int) = 64字节
char *pp = (char *)calloc(16, sizeof(char ));//空间大小16*sizeof(char ) = 16字节
char *ppp = (char *)calloc(16, sizeof(int ));//空间大小16*sizeof(int ) = 64字节
//********************************************************************************************************
(3)realloc函数:void *realloc(void *mem_address, unsigned int newsize)
(3.1)mem_address:需要扩展/缩小的空间的首地址(一般使用malloc或calloc出的空间首地址)。
(3.2)newsize:需要扩容/缩小的大小(比如原来malloc了1k,想扩容成2k,newsize就填2048)。
(3.3)返回值:
(3.3.1)缩小:仅改变索引的信息;
(3.3.2)扩容:有两种情况。直接拓展:如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,将返回原指针。重新分配:如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
如果申请失败,将返回NULL,此时,原来的指针仍然有效。
(3.4)示例:char *p=(char *)malloc(1024);//申请1k空间
char *f = (char *)realloc(p, 2048);//将空间扩容到2k
//********************************************************************************************************
(4)new函数:
(4.1)初始化:取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
(4.2)三种使用方法:
new 数据类型
new 数据类型(初始值)
new 数据类型[常量表达式]
(4.3)示例:
int * p = new int;
int *pp = new int(5); //pp初始化值是5
int *ppp = new int[1024] //空间大小1024*sizeof(int) = 4096个字节
delete p;
delete pp;
delete[] ppp; //申请用了[],则在释放时要用delete[]
本文详细介绍了C++中的内存分配函数malloc、calloc、realloc以及new的用法、参数和示例,帮助理解内存管理的关键概念。

5762

被折叠的 条评论
为什么被折叠?



