前言

以前对c++的new[]的了解就是开辟一块内存,直到我最近在程序中用到它才发现我的了解太浅。

问题分析

new[]得到的内存空间不会自动初始化

new[]是在堆区中动态分配指定大小的内存,但是这块内存并不会自动进行初始化。也就是说这块内存并不会被置0,所以当堆中申请的内存中原有数据会被保留成为垃圾数据。下图进行了验证:

如果我们误认为数据默认初始化的话会带来一些麻烦,c++提供了在new[]时同时初始化内存的办法就时在后面加上( ),即new[]() 。

我们在上图的程序使用new验证一下:

new[]申请需要的内存时最好多申请一点

因为new的数据是在堆中申请,而且不会默认进行初始化所以会有很多垃圾数据在我们申请的内存处。即便我们把我们申请的内存初始化了,也无法保证在我们申请的内存周围不存在垃圾数据。如下图我们new了272个字节,结果272字节后有垃圾数据,那末我们在处理得到的那272个字节的时候如果忽略了后面有垃圾数据没有控制输出字符串的长度而直接讲272个字符组成的字符串显示将会把垃圾数据也显示出来。(我们可以多申请几个字节然后初始化为0,这样不易出错)

new[]的内存空间一定要用delete[]释放

new/delete与new[]/delete[]最好配套使用,虽然对于基本数据类型使用new既可以用delete也可以用delete[]释放,但是对于类类型而言其涉及到构造函数与析构函数的调用,在new 对象数组时其地址的前四个字节保存的是此对象数组中对象的个数,以便于在其调用构造代理函数来调用各个对象的构造函数(或者是调用析构函数时通过代理析构函数调用各个析构函数),因此在用delete[]释放对象时其会自动往后偏移4个字节然后将后面的字节当做是this指针调用各个析构函数。如果用new 动态申请一个对象再用delete[]就会出错,同样用new[]的对象数组再用delete 也会出错。

最新文章

  1. 解决BUG:CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default
  2. 关于export 和 require(import)的一些技巧和常用方法
  3. PHP 中获取当前时间[Datetime Now]
  4. iPhone重绘机制drawRect
  5. poj 3735 大数量反复操作问题(矩阵高速幂)
  6. 关于SubclassWindow()和SubclassDlgItem
  7. Indiegogo: An International Crowdfunding Platform to Raise Money
  8. Eclipse部署Web项目(图文讲解)
  9. crm维护踩坑记(一)
  10. MySQL正则表达式初步
  11. PL/SQL执行计划查看
  12. 2018 HDU多校第四场赛后补题
  13. PhoneGap和Cordova应该用哪一个?
  14. human pose estimation
  15. java实现随机四则运算
  16. Windows10开发手记-Windows App Certification Kit使用教程
  17. 【19道XSS题目】不服来战!(转)
  18. Django视图之视图函数
  19. CSLA.Net学习(3)INotifyPropertyChanged和IDataErrorInfo
  20. WebSocket安卓客户端实现详解(一)–连接建立与重连

热门文章

  1. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解
  2. python使用try...except语句处理异常
  3. 设计模式—singleton(单例模式)
  4. Android学习之Broadcast初体验
  5. Android Studio 之 TextView基础
  6. 微信小程序getUserProfile适配方案
  7. 带你全面认识CMMI V2.0(二)
  8. 2020 OO 第一单元总结 表达式求导
  9. surging 如何使用流媒体服务
  10. 869. Reordered Power of 2