malloc、calloc、realloc和new详解

本文详细介绍了C++中的内存分配函数malloc、calloc、realloc以及new的用法、参数和示例,帮助理解内存管理的关键概念。

上述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[] 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值