c++中new[ ]与delete[ ]的分析
前言
以前对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 也会出错。
c++中new[ ]与delete[ ]的分析的更多相关文章
- C++ 中数组做参数的分析
C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...
- 数据库设计中的Soft Delete模式
最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...
- 电商系统中的商品模型的分析与设计—续
前言 在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介 ...
- AX中四种库存ABC分析法原理研究
库存ABC分类,简单的说就是抓大放小,是为了让我们抓住重点,用最大精力来管理最重要的物料,而对于不太重要的物料则可以用较少的精力进行管理.它和我们平常说的八二法则有异曲同工之妙. 既然要应用库存ABC ...
- SQL中的Null深入研究分析
SQL中的Null深入研究分析 虽然熟练掌握SQL的人对于Null不会有什么疑问,但总结得很全的文章还是很难找,看到一篇英文版的, 感觉还不错. Tony Hoare 在1965年发明了 null 引 ...
- try-catch-finally中return的执行情况分析
try-catch-finally中return的执行情况分析: 1.在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 2.如果try中有异常,执 ...
- c++中new和delete的使用方法
c++中new和delete的使用方法 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间 ...
- C++中的new/delete与operator new/operator delete
new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数. new operator(1)调用opera ...
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
随机推荐
- Linux 切换用户提示Permission denied
在使用 su - hdfs 切换到 hdfs 用户时提示 su: Permission denied,但是密码确认是没错的. 找到文件 /etc/pam.d/su,注释掉 auth required ...
- 攻防世界 reverse BABYRE
BABYRE XCTF 4th-WHCTF-2017 int __cdecl main(int argc, const char **argv, const char **envp) { char ...
- 【新阁教育】台达DVP-ES3 ModbusTCP通信案例
本文主要针对台达DVP-ES3系列PLC,实现上位机与PLC之间的ModbusTCP通信. 一.硬件说明 DVP-ES3 系列为高阶应用可编程控制器, CPU 内置4 组高速计数器输入.4组轴输出(脉 ...
- 最小生成树(Prim算法,Kruskal算法 )
声明:图片及内容基于https://www.bilibili.com/video/BV1yp4y1Q74o?from=articleDetail 最小生成树原理 . 普利姆(Prim)算法 原理 Pr ...
- 使用 Github Actions artifact 在 workflow job 之间共享数据
(AgileConfig)[https://github.com/kklldog/AgileConfig] 在使用 react 编写UI后,变成了一个彻彻底底的前后端分离的项目,上一次解决了把reac ...
- PReact10.5.13源码理解
React源码看过几次,每次都没有坚持下来,索性学习一下PReact部分,网上讲解源码的不少,但是基本已经过时,所以自己来梳理下 render.js部分 import { EMPTY_OBJ, EMP ...
- DAOS 分布式异步对象存储|相关组件
DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的. DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道: 用于带 ...
- 百度开源中国(Java)面经
一.自我介绍 面试嘛,万年不变还是自我介绍,就说说你是干嘛的(专业是啥),为什么会选择该公司(说一说自己为何向往Java开发),再谈谈自己的优点(兴趣爱好).如果人家叫停了,就别一股脑接着讲了,停下来 ...
- Ray Tracing in one Weekend 阅读笔记
目录 一.创建Ray类,实现背景 二.加入一个球 三.让球的颜色和其法线信息相关 四.多种形状,多个碰撞体 五.封装相机类 六.抗锯齿 七.漫发射 八.抽象出材料类(编写metal类) 九.介质材料( ...
- c++ 数组定义及初始化
C ++提供了一种数据结构,即数组,该数组存储一个固定大小的由相同类型元素构成的顺序集合. 数组中的元素存储在一个连续内存位置中,元素可通过数组索引访问, 最低地址对应于第一个元素,最高地址对应于最后 ...