C++之动态分配new 删除delete 初始化memset

news2024/11/23 21:34:19

文章目录

    • 1.动态分配 new
      • 1.引言
      • 2.new的实现
    • 2.删除 delete
    • 3.初始化 memset

1.动态分配 new

1.引言

用new创建数组的优势:由于new创建的对象是在运行时确立的,所以有着具体情况具体分析的优点,那么什么叫做具体情况具体分析呢?

举一个十分贴切的例子:

比如你在度假,已经做好每天的参观计划,可突然有一天天气不好或是你的心情不好,此时你就不想参观了,如果此时是在编译状态,系统是不允许的,你必须按照计划去参观,但运行时状态,系统是允许的,此时你就可以呆在酒店尽情的玩耍了,用new创建数组也有此优点,即数组长度可以根据情况而定


2.new的实现

使用 n e w new new 运算符必须已知数据类型,它会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址;如果申请不成功,则返回空指针 N U L L NULL NULL

n e w new new 运算符返回的是一个指向所分配对象的 指针,对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名


n e w new new 语法:

  1. 指针变量名 = n e w new new 类型标识符;
  2. 指针变量名 = n e w new new 类型标识符 (初始值);
  3. 指针变量名 = n e w new new 类型标识符 [内存单元个数];

①对于单个变量:

第一种定义方式:

int *a=new int;

表示开辟一个存放整数的存储空间,返回一个指向该存储空间的地址,int *a = new int 即为将一个 i n t int int 类型的地址赋值给整型指针 a a a


对于第二种定义方式:

int *a=new int(6)
cout<< *a <<endl; // 6

也是开辟了一个整型空间,并定义了一个指向该空间的指针 a a a,只是此时同时将指向的整数空间 ∗ a *a a 的值赋值为 6 6 6


②对于数组空间:

第三种定义方式:

int n;
cin>>n;
int* a=new int[n];

对于数组的开辟,要使用方括号 [   ] [\ ] [ ],表示开辟一段连续的含有 n n n 个类型的内存空间


2.删除 delete

对于已经开辟的内存空间,我们还需要手动进行释放

d e l e t e delete delete 语法:

  1. d e l e t e delete delete 动态分配内存的指针名
  2. d e l e t e [   ] delete[\ ] delete[ ] 动态分配的内存的指针名

①对于单个变量:

int* a=new int;
delete a;

int* b=new int(6);
delete a;

②对于数组空间:

int* a=new int[n];
delete[] a;

使用注意:

  1. 被释放的指针 a a a 必须是 指向动态分配的内存空间的指针,否则会报错;
  2. 如果动态分配了一个数组,但是却用 delete p 的方式释放,没有用 [   ] [\ ] [ ],则编译时没有问题,运行时也一般不会发生错误,但实际上会导致动态分配的数组没有被完全释放

3.初始化 memset

m e m s e t memset memset:为大空间结构体或大数组空间初始化或清零

①作用
作用是将某一块内存中的内容全部设置为指定的值,这个函数通常为新申请的内存做初始化工作,是对较大的结构体或数组进行清零操作的一种最快方法


②语法
m e m s e t memset memset 语法void* memset(void *s,int val,int len)

表示将 s s s中当前位置及后面的 len个字节用 val 替换并返回 s s s


③使用注意
m e m s e t memset memset 函数按字节对内存块进行初始化,所以不能用它将 i n t int int 数组初始化为 0 和 − 1 0 和 -1 01之外的其他值

这是因为 m e m s e t memset memset 使用的是按字节赋值,即对每个字节赋同样的值,这样组成int型的4个字节就会被赋成相同的值,而由于 0 0 0 的二进制补码全为 0 0 0 − 1 -1 1 的二进制补码全为 1 1 1,不容易弄错


对于 − 1 -1 1 来说,它的二进制为 1 1 1 的反码 + 1 +1 +1,即为 1 1 1 的补码

图解:

在这里插入图片描述


第一种情况:

针对字符串数组

char s[4];
memset(s,'1',4);

结果为:由上述可知,因为是对字节进行修改, c h a r char char 数组 s s s,一共有 4 4 4 字节空间,因此我们将全部的字符数组成员,都改为 ′ 1 ′ '1' 1

s [ 0 ] = s [ 1 ] = s [ 2 ] = s [ 3 ] = ′ 1 ′ s[0]=s[1]=s[2]=s[3]='1' s[0]=s[1]=s[2]=s[3]=1


第二种情况:

针对整型数组

char a[4];
memset(a,1,4);

结果为:仅仅将数组 a a a 的前四个字节,也就是第一个元素 a [ 0 ] a[0] a[0] 4 4 4 个字节中的每一个字节都变成了1,而后三个元素还是未分配内容的状态

即将这个 i n t int int元素的每个字节都变成了0000 0001,再合起来数组得到数组 a 的第一个元素也就是:
a [ 0 ] = 00000001   00000001   00000001   00000001 ( 2 ) = 16843009 a[0]=00000001\ 00000001\ 00000001\ 00000001(2)=16843009 a[0]=00000001 00000001 00000001 00000001(2)=16843009

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/595403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux led 驱动

前言 今天是儿童节&#xff0c;挣个奖牌给小孩玩玩。 在 linux 驱动大家庭中&#xff0c;LED 驱动算是个儿童&#xff0c;今天就写写他吧。正好之前写过他的婴儿时期《i.MX6ULL 裸机点亮 LED》&#xff0c;记得那时候他还穿着开裆裤呢&#xff0c;裸鸡嘛。 ioremap() 裸机程…

某点资讯Signature纯算逆向

本篇主要是介绍一些工作的运用熟练性&#xff0c;以及跟踪堆栈去看是否做一些其他操作等&#xff1a; 抓包: signature 为加密值&#xff1b; 先上trace下堆栈及加密 我们把结果base64下&#xff0c;看结果是否一致&#xff0c;来判断base64是否魔改 验证base64为标准&…

新规之下产业园区如何合理收费水电费用

一、政策背景 2018年3月30日&#xff0c;国家发改委发布《国家发展改革委关于降低一般工商业电价有关事项的通知》。明确提出进一步规范和降低电网环节收费&#xff0c;一是提高两部制电价的灵活性&#xff1b;二是全面清理规范电网企业在输配电价之外的收费项目&#xff0c;重…

三极管 场效应管

NPN 高电平导通 PNP 低电平导通 N-MOS 高电平导通 P-MOS 低电平导通 1. NPN 三极管&#xff0c;对于软件工程师来说&#xff0c;只需要关注数字电路&#xff0c;即: 导通还是截止&#xff0c;高电平还是低电平。至于三级管内部如何构成的&#xff0c;以及串了多少个电阻&am…

智能安全配电装置在老旧建筑防火中的应用

【摘要】现代社会的发展离不开电能&#xff0c;随着电能应用的广泛性&#xff0c;对用电安全有了更高的要求。近些年来&#xff0c;用电安全形式严峻&#xff0c;尤其是一些老旧建筑中因用电而引起的火灾事故频发&#xff0c;造成一系列严重的损失&#xff0c;严重影响着民众的…

PCout(n) -- STM32F103RCT6 位带操作

1. 使用位带操作控制GPIO口的输入、输出模式&#xff0c;以及输出的电平高、低 注&#xff1a;位带操作一般是操作单独的一个bit 位&#xff0c;而&&#xff0c;| 则可操作多个bit位&#xff0c;看自己的需求吧。&#xff08;不懂&&#xff0c;| 是什么意思的自行问度…

MySQL-6-多表操作

一、复制表 格式 create table 表名 select查询语句注意&#xff1a;复制成新表时&#xff0c;键值&#xff08;pri,index等等&#xff09;索引不会同步复制案例 mysql> create table t2 select name,sex,age from user;二、多表查询 2.1、 多表查询–>连接查询 将2个…

Vue.js 比较重要知识点总结一

概述 谈一谈你对 Vue.js 的响应式数据的理解Vue3 出现解决了什么问题&#xff1f;它有哪些优势&#xff1f;Vue3 新特性有哪些vue2 和 vue3 的响应式有什么区别&#xff1f; 谈一谈你对 Vue.js 的响应式数据的理解 Vue 2.x 对象类型&#xff1a;通过 object.defineProperty(…

MySQL——初窥门径

前言 六一&#xff1f;作为一个大小孩当然是快快乐乐搞技术啦~在这篇文章中&#xff0c;荔枝会梳理SQL语句的基本语法以及MySQL中的函数、约束。多表关系以及查询、事务和事务隔离级别等内容&#xff0c;大致内容归属于MySQL基础知识&#xff0c;荔枝又弄了一篇万字长文哈哈哈哈…

R:GAM非线性回归曲线拟合与散点密度图绘制

作者:CSDN @ _养乐多_ 本文将介绍使用R语言以及GAM模型,绘制回归曲线和散点密度图。 文章目录 一、R语言脚本二、色带一、R语言脚本 install.packages("ggpointdensity") install.packages("ggplot2") insta

IPD发展史

随着IPD&#xff08;集成产品开发&#xff09;在IBM、华为等企业取得了巨大的成功&#xff0c;其他行业也开始在相关新产品研发中初步引入IPD的研发管理理念及模式&#xff0c;对IPD在行业的应用进行初步的探索和研究。 为了更好地应用IPD &#xff0c;不仅要对它的理念和思想理…

浅谈高等学校能源监控管理体系建设

摘要&#xff1a;现代高校担当着人才培养&#xff0c;社会服务和文化传承与创新的光荣使命。高校低碳节能工作是加快建设“和谐社会”、“绿色校园”的重要举措 。当前高校以“数字化能源监测平台”为重心 &#xff0c;积极推动能源管理的转型 。该文总结高校能源监管平台建设的…

达梦数据库作业调度及警报配置

目录 作业... 4 创建代理环境... 4 1、命令行创建及删除... 4 2、客户端创建及删除... 4 操作员... 5 1、命令行创建及删除... 5 2、客户端创建及删除... 5 作业... 6 一、命令行... 6 1、命令行创建作业... 6 2、命令行修改作业... 7 3、启动或暂停作业... 7 4、…

MATLAB与深度学习:Neural Network Toolbox和Deep Learning Toolbox的使用和模型设计

章节一&#xff1a;引言 在当今人工智能和深度学习的时代&#xff0c;MATLAB作为一种功能强大的科学计算和数据分析工具&#xff0c;在深度学习领域也发挥着重要作用。本文将重点介绍MATLAB中的两个关键工具&#xff1a;Neural Network Toolbox和Deep Learning Toolbox的使用和…

chatgpt赋能python:Python主页的SEO优化

Python主页的SEO优化 Python是一种简单易学、高效灵活的编程语言。其主页Python.org是全球最受欢迎的编程语言之一的官方网站。但是&#xff0c;即使是最著名的网站也需要进行优化&#xff0c;以便在搜索引擎中排名更高。在本文中&#xff0c;我们将探讨如何通过SEO来改进Pyth…

关系型数据库一些概念性的知识点总结

在当今数据驱动的世界中&#xff0c;信息为王。从客户资料到金融交易&#xff0c;每个组织都依赖数据来做出明智的决策并在竞争中保持领先地位。但随着数据量以前所未有的速度增长&#xff0c;管理和分析所有这些信息很快就会变得不堪重负。这就是关系数据库的用武之地。 关系数…

kafka的基础知识及概念

介绍 kafka在过去几年获得了巨大的普及。在微服务架构中&#xff0c;它起着举足轻重的作用。它使数据能够从一项服务转移到另一项服务。我开始这个系列是为了帮助初学者深入了解 Kafka。但是&#xff0c;在我们深入之前&#xff0c;了解一些基础知识很重要。因此&#xff0c;在…

《智能新工厂规划白皮书》:新工厂发展趋势一览

在经济下行压力、人口红利消失、消费结构升级、疫情冲击等多种因素推动下&#xff0c;传统工厂的寒冬已至&#xff0c;必须要变革才能顺应未来的发展趋势。伴随着5G、工业互联网、AI、工业大数据、工业软件等技术或产品的发展融合&#xff0c;许多企业纷纷规划建设智能新工厂&a…

【Web服务器集群】Nginx网站服务

文章目录 一、Nginx 概述1.什么是 Nginx2.Nginx 的特点3.Nginx 应用场景 二、Nginx 服务基础1.编译安装 Nginx 服务1.1 布置环境1.2 安装依赖包1.3 创建运行用户、组1.4 编译安装 2.Nginx 的运行控制2.1 检查配置文件2.2 启动、停止 Nginx2.3 日志分割以及升级 Nginx 服务2.4 添…

Linux - 第18节 - 网络基础(传输层一)

目录 1.传输层 1.1.再谈端口号 1.2.端口号范围划分 1.3.认识知名端口号 1.4.两个问题 1.5.netstat命令 1.6.pidof命令 2.UDP协议 2.1.UDP协议格式 2.2.UDP协议的特点 2.3.面向数据报 2.4.UDP的缓冲区 2.5.UDP使用注意事项 2.6.基于UDP的应用层协议 3.TCP协议 3…