C语言内存申请/释放函数,C++内存申请/释放函数

C语言

malloc函数:申请堆区空间,并返回一个指向它的指针。

        原型:void *malloc(size_t size)

        参数:size_t 是一些C/C++标准在stddef.h中定义的,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数。size 是需要申请的内存块大小,以字节为单位。 

        返回值:申请成功返回指向已分配内存的指针,申请失败返回NULL。

        用法:

char *str;
/*申请堆区空间*/

str = (char *)malloc(20);

if(NULL == str)

{

        printf("申请失败");

}

calloc函数:申请堆区空间,返回申请空间的地址,并将每个字节初始化为0。

        原型:void *calloc(size_t num,size_t size)

        参数num为元素个数,size为元素大小。

        返回值:申请成功返回指向已分配内存的指针,申请失败返回NULL。

        用法

int *p ;
/*申请堆区空间*/
p = (int *)calloc(10,sizeof(int));
if(NULL == p)
{
        printf("申请失败")
}

free函数:释放指针指向的堆区空间

        原型:void free(void *memblock)

        参数memblock指针指向的内存

        返回值:空

        用法

free(str);
free(p);

C++

申请1个int类型空间并且释放

int *p = new int;        //申请一个int大小的空间
delete p;                   //释放空间
int *p = new int(10);//申请1个int大小的空间并初始化为10;

delete p;                //释放空间

申请10个int类型的空间并释放

int *p = new int[10];//申请10个int类型的空间
delete p;                //释放空间

区别:

申请的内存所在位置

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

那么自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

返回类型安全性

new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

内存分配失败时的返回值

new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。

使用new操作符来分配对象内存时会经历三个步骤:

  • 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
  • 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
  • 第三部:对象构造完成后,返回一个指向该对象的指针。

使用delete操作符来释放对象内存时会经历两个步骤:

  • 第一步:调用对象的析构函数。
  • 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。

mealloc不会调用构造函数,free也不会调用析构函数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值