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三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
随机推荐
- windbg安装pykd记录
https://githomelab.ru/pykd/pykd 1.安装python (坑,分x86和x64,对应windbg版本) 2.安装pykd:'pip install pykd' 3.安 ...
- 《C++反汇编与逆向分析技术揭秘》--数据类型
浮点数类型 IEEE标准从逻辑上采用一个三元组{S, E, M}来表示一个数N,它规定基数为2,符号位S用0和1分别表示正和负,尾数M用原码表示,阶码E用移码表示.根据浮点数的规格化方法,尾数域的 ...
- SSM-员工管理项目实战-CRUD-增删改查
SSM-CRUD 一.项目简介 主界面演示 功能点 分页 数据校验 ajax Rest 风格的 URI 技术点 基础框架 - ssm(Spring + SpringMVC + MyBatis) 数据库 ...
- .NET 开源配置组件 AgileConfig 初体验
介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人员可能更熟悉 ApolloConfig,这个组件功能也很完善,d ...
- C++并发与多线程学习笔记--互斥量、用法、死锁概念
互斥量(mutex)的基本概念 互斥量的用法 lock(), unlock() std::lock_guard类模板 死锁 死锁演示 死锁的一般解决方案 std::lock()函数模板 std::lo ...
- sql 如何删除(代替)字段内某一部分内容
方法一(此方法既可用于删除某一列字段中的某部分字符,也可用于替换某一列字段中的某部分字符) update Table_Name set Column_Name=replace(Column_Name, ...
- jasypt-spring-boot提示Failed to bind properties
1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description: Failed to bind properties under 'spr ...
- Alpine镜像
Alpine Linux 是一个面向安全,轻量级的基于musl libc与busybox项目的Linux发行版. Alpine 提供了自己的包管理工具 apk,可以通过 https://pkgs.al ...
- 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性
文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...
- windows CMD实现的信息收集工具
bat1 @echo off echo ====================================================== echo [*] 所有盘符下的有趣文件 @For ...