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三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
随机推荐
- salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容
本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...
- 涂鸦基于OAuth2在开发者平台上的探索与实践
前言 开发授权(OAuth2)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资料(如照片.视频.联系人列表),而无需将用户名和密码提供给第三方应用. OAuth2允许用户提供一 ...
- [Kong 与 Konga 与 Postgres数据库] 之 Kuberneres 部署
1.Kong的概述 Kong是一个clould-native.快速的.可扩展的.分布式的微服务抽象层(也称为API网关.API中间件或在某些情况下称为服务网格)框架.Kong作为开源项目在2015年推 ...
- 给Nginx配置日志格式和调整日期格式
效果对比 官方默认日志格式 # 官方默认日志格式 log_format main '$server_name $remote_addr - $remote_user [$time_local] &qu ...
- ElasticSearch创建文档
1. 新建文档 支持自动生成文档 ID 和指定文档 ID 两种方式 通过调用 "post/users/_doc" ,系统会自动生成 document id 使 用HTTP PUT ...
- ES 分页方案
ES 中,存在三种常见的分页方案: FROM, SIZE Search-After Scroll 下面将依次比较三种方案之间的 trede-off,并给出相应建议的应用场景. 常见分页,FROM, S ...
- 【Azure 微服务】Service Fabric中微服务在升级时,遇见Warning - System.Collections.Generic.KeyNotFoundException 服务无法正常运行
问题描述 使用.Net Framework 4.5.2为架构的Service Fabric微服务应用,在升级后发布到Azure Fabric中,服务无法运行.通过Service Fabric Expl ...
- Dynamics CRM调用选择用户弹窗
在开发Dynamics CRM的部分场景时我们会遇到一些需要去锁定用户的操作,所以就需要使用Javascript把用户的弹窗弹出来.具体做法如下 我们需要拼接一个弹出选择记录框的url Url格式:C ...
- Spring(七篇)
(一)Spring 概述 (二)Spring Bean入门介绍 (三)Spring Bean继续入门 (四)Spring Bean注入方试 (五)Spring AOP简述 (六)Spring AOP切 ...
- Mybatis-plus 下
Mybatis-plus 下 查询操作 1.查询单个用户 @Test public void testSelectById(){ User user = userMapper.selectById(1 ...