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三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
随机推荐
- ch1_5_2求无序序列中第k小的元素
import java.util.Arrays; import java.util.PriorityQueue; public class ch1_5_2求无序序列中第k小的元素 { public s ...
- 计算机体系结构——CH3存储系统
计算机体系结构--CH3存储系统 右键点击查看图像,查看清晰图像 X-mind 计算机体系结构--CH3存储系统 存储系统原理 主要性能 速度 容量 价格 两种存储系统 Cache与主存储器 虚拟存储 ...
- BUAA_2021_SE_READING_#1
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 个人阅读作业#1 我在这个课程的目标是 通过课程学习,完成第一个可以称之为"软件"的项目 ...
- 消息中间件-RabbitMQ消息可靠性和插件化机制
package com.study.rabbitmq.a132.confirm; import com.rabbitmq.client.*; import java.io.IOException; i ...
- Spring (二)SpringIoC和DI注解开发
1.Spring配置数据源 1.1 数据源(连接池)的作用 数据源(连接池)是提高程序性能出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 ...
- SQL Server 用法总结
1 数据分页 Offset and Fetch 的分页方法 最优> ROW_NUMBER() 的分页方法 eg: select ID,Title from Article_Detail ord ...
- JUC包的线程池详解
为什么要使用线程池 创建/销毁线程需要消耗系统资源,线程池可以复用已创建的线程. 控制并发的数量.并发数量过多,可能会导致资源消耗过多,从而造成服务器崩溃.(主要原因) 可以对线程做统一管理. JUC ...
- 抛弃vuex ,拥抱ts,手撸泛型Store<T>!
前段时间学习了下vue3 和ts ,就尝试下做了个项目,结果发现vuex和ts几乎无法结合,越写越别扭,开始怀疑用ts就是自己给自己挖坑,然后加了几个vue相关的群,去抱怨了几句,得到大佬指点:你可以 ...
- 适用于分布式ID的雪花算法
基于Java实现的适用于分布式ID的雪花算法工具类,这里存一下日后好找 /** * 雪花算法生成ID */ public class SnowFlakeUtil { private final sta ...
- PAT归纳总结——关于C++输入输出格式问题的一些总结
自从使用了C++就不再想使用C语言来刷题了,C++便捷的输入输出方式,以及一些STL库函数的使用都要比使用C语言方便的多.但是使用的时候还有一些需要注意的地方,在这篇博客中写一下.(更好的教程可以参看 ...