new与delete和new[ ]与delete[ ]

C语言中怎样申请内存?

malloccalloc、realloc函数申请内存,
free将申请的内存释放掉
malloccalloc、realloc
共同点:
  1.都是从堆上开辟内存;(堆上开辟的内存需要手动释放,而栈上开辟的内存,函数运行结束,就会释放掉)
  2.必须使用free释放内存;
  3.返回值都是void*(void* 可以接收任何类型的数据)

不同点:
malloc:
(1)一个参数,malloc(所申请空间的字节数)
       例如:int* p= (int*)mallocsizeofint));
(2malloc会检测空间是否开辟成功,如果成功返回地址,否则返回空指针

calloc:该函数会将申请的空间初始化为0
(1)两个参数,calloc(元素个数,单个元素的大小)
       例如:int*p=(int*)calloc10sizeofint));
(2)如果申请成功,返回地址并且把空间初始化为0,否则返回空指针

realloc:改变原有空间的大小,如果不能改变,会重新开辟一块内存,不会初始化,把旧空间的内容复制过来。
(1)二个参数,realloc(要改变内存大小的指针名,新的大小)
例如:int*p=(int*)malloc(sizeof(int));
     realloc(void*p,10*sizeof(int));
注:p若为空指针,则realloc函数的功能和malloc一样;
   p若不为空指针(即p空间存在),新空间如果比旧空间大一点,就返回旧空间的地址,否则返回新空间的地址。

C++中申请内存
new和new[ ]可动态申请内存
delete和delete[ ]可把申请的内存清除
new

int *p1=new int//动态申请一个整形的空间,有四个字节
int*p2=new int4//动态申请一个整形的空间,有四个字节,且初始化为4
new在底层实现时做的事:
 1.通过malloc申请空间
   new----->void* operator new(size_t,size)size:申请空间的字节数----->malloc()//调用malloc开辟空间
 2.调用析构函数初始化对象

这里写图片描述

这里写图片描述
内置类型:int* p=new int;
自定义类型:Test*p=new Test;
delete

delete p(delete 地址);
调用析构函数,清除空间的内容,在释放空间
   delete---->operator delete(p)---->free(P)

这里写图片描述

new[ ]

int *p2=new int[N]//动态申请一个整形数组的空间,数组里有N个元素,共有4N个字节
new[]在底层做了两件事:
  1.通过malloc开辟空间
    new[]--->void* operator new[](size_t count)count是连续空间的字节数 --->operator new(count)--->malloc开辟空间
  2.调用N次构造函数初始化每个对象
注:析构函数有的话,需要多开辟四个字节---count=4*N+4
   析构函数没有的话,count=4*N

为什么多申请四个字节?
   答:这四个字节是给析构函数申请的,空间里保存的是对象的个数(N),如果不保存对象的个数,编译器就不知道该调多少次析构函数,且这四个字节后面放的才是对象(第一个对象)。

delete[ ]

销毁时:最早创建的最晚销毁,即采用的是先进后出。
调用N次析构函数,清空空间的内容,释放空间。
 1.从释放地址前四个字节中取出对象个数,即应该调用析构函数的次数N--->调用N次析构函数
 2.operator delete[]( p1(从第一个对象往前偏移四个字节) )--->operator delete(p)--->free(P)

new与delete一定要匹配使用
new[ ]与delete[ ]一定要匹配使用

new/delete和malloc/free的区别:
1.它们都可以进行动态内存申请和销毁;
2.new/delete是C++操作符,malloc/free是C语言的库函数;
3.new/delete申请内存的同时会调用构造函数初始化对象和调用析构函数清理对象, malloc/free只是申请内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值