更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

C++中什么时候用new[]申请,可以用delete释放

  • 发布:图小论
  • 来源: 图论软件
  • 时间:2017-11-13 16:24

c语言中的 malloc 和 free ,这两个是库函数,而在c++中 new 和 delete是运算符(和 + - * /一样),在使用new的时可以看成使用默认使用构造函数+malloc,使用delete时可以看成使用析构函数+free。

简单说一下malloc :

系统管理堆内存运用的是链表的方式:分配堆内存地址时依次由低向高遍历”堆链“,但遇到大小合适的堆块时,将这个堆块从”堆链“中删除,其他的继续构成新的链。当这一块的内存分配完后还有剩余,则将剩余的继续添加到”堆链“里分配空间时,不仅会分配到程序员所需空间的大小,系统还会分配一头”Header“



可以说这个Header中保存了一个所申请空间的大小,而系统返回的Header是不能被用户访问的。

--------------------------------------------------------------------------------------

接下来是正文:

情况1

int* a = new int[10];

delete a;

delete[] a;

第一种方式一定会造成内存泄漏吗?

其实两种释放内存的方式效果相同,原因在于:分配简单类型内存时,内存大小已经确定,系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数。

(它直接通过指针可以获取实际分配的内存空间,在分配过程中系统会记录分配内存的大小等信息,此信息保存在结构体CrtMemBlockHeader中,具体情况可参看VC安装目录下CRT/SRC/DBGDEL.cpp)

情况2

如果是类class,则情况会出现不同

这个程序运行后会出现这个错误


这个错误的意思是程序在结束后系统会调用析构函数发现我们在上面malloc中提出的Header被错误的更改了。 假设用户接受到的指针返回值是address,因为在使用delete[]时,会默认从address-4开始,而不是addrss。(4是因为malloc结构体中的类型为long,而且在32位系统下。这里减一是一个单元格,也就4)。而这个结构体中存储的size是将要释放的大小。


这个是加上那个引用后的运行结果,可以看到它只析构了一次。

所以1. delete a 仅释放了a指针指向的全部内存空间,但是只调用了a[0]的析构函数,剩下的a[1]和a[2]中m申请的内存不能够释放,则造成了内存泄漏。 2. delete[] a 释放了a指针申请的内存并且调用析构函数释放掉所有申请的内存

总结:假设 ptr 代表new返回的内存空间地址 delete ptr 代表释放ptr指向内存,并且只能用来释放内存。 delete[] ptr 代表释放ptr指向的内存,并且逐个调用对象的析构函数。 对于像int/char/long/int*/struct等简单数据类型,由于没有析构函数,所以delete和delete[] 是一样!但是c++中的对象数组就不同了!

本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C语言/C++编程小程序,大智慧,简单程序
下一篇:C++11新特性decltype修饰符

C语言创建windows窗口实例

C++回调函数是什么?

C++ shared_ptr和动态数组

C语言有哪些关键词,C语言44个关键词大全

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省