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

这篇具有很好参考价值的文章主要介绍了C++之动态分配new & 删除delete & 初始化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 的补码

图解:

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


第一种情况:

针对字符串数组

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
文章来源地址https://www.toymoban.com/news/detail-475102.html

到了这里,关于C++之动态分配new & 删除delete & 初始化memset的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 三、Kafka生产者1---Kafka生产者初始化-new KafkaProducer

    概述 本文主要是分享Kafka初始化生产者的 大体过程 初始化过程中会新建很多对象,本文暂先分享部分对象 1.分区器---Partitioner partitioner 2.重试时间---long retryBackoffMs 3.序列化器---SerializerK keySerializer,SerializerV valueSerializer 4.拦截器--- ListProducerInterceptorK, V interceptorList 5.累加器-

    2024年03月14日
    浏览(50)
  • 链表的初始化、取值、查找、插入、删除

    链表是一种常见的数据结构,它的节点不像数组一样是连续的,而是通过指针链接在一起的。下面是链表的初始化、取值、查找、插入和删除的示例代码,均使用C语言实现,并带有标头。 链表初始化代码: 以上代码中,定义了一个`ListNode`结构体,其中`val`表示节点的值,

    2024年02月07日
    浏览(37)
  • 17 数组动态初始化

            动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。         格式:数据类型[] 数组名 = new 数据类型[数组长度]         实验结果:   

    2024年02月16日
    浏览(31)
  • 顺序表创建,初始化,赋值,取值,查找,插入与删除(附小例题)

    由n(n≥0)个数据结构相同的元素构成的有限序列。 1)除了第一个元素外,结构中的每一个数据元素均只有一个前驱 2)除了最后一个元素外,结构中的每一个数据元素均只有一个后驱 用一组地址 连续的存储单元依次 存储线性表的数据元素。 优点 : 随机存储 缺点 :在做插

    2024年02月07日
    浏览(32)
  • 数组练习题,数组的动态初始化

    定义一个数组,求和 定义一个数组,统计数组里面一共有多少能够被3 整除的数字: 定义一整数类型数组,如果该数字是奇数,则将当前数字扩大两倍,如果是偶数,则将该数字变成该数字的1/2. 一个循环尽量只做一件事情,虽然把打印写的同一个循环里面可以,结果一样,

    2024年02月15日
    浏览(39)
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 我们这里就不多介绍这里的 GIT 了,百度百科和维基百科上都有很多介绍,我们这

    2024年02月05日
    浏览(29)
  • C++结构体初始化方法

    在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结。 如果只是想全部初始化为 0 可以按照如下方法 结构体包含数组(数组在结构体变量定义完就初始化为0) 直接赋值的方法虽然很直观,但是如果需要初始化多个结构体变量,

    2024年02月16日
    浏览(37)
  • C++之初始化列表详细剖析

    初始化列表:以一个 冒号开始 ,接着是一个以 逗号分隔的数据成员列表 ,每个 \\\"成员变量\\\" 后面跟一个 放在括号中的初始值或表达式。 不知道大家有没有想过这样一个问题,成员函数明明可以在函数内部对成员变量进行赋值,那为什么还要搞出初始化列表这个东西呢?这个

    2024年02月06日
    浏览(45)
  • C++ | 谈谈构造函数的初始化列表

    我们知道,对于下面这个类A的成员变量 _a1 和 _a2 属于【声明】,还没有在内存中为其开辟出一块空间以供存放,真正开出空间则是在【定义】的时候,那何时定义呢?也就是使用这个类A去实例化出对象的时候 这个对象的空间被开出来了,难道里面的成员变量就一定开出空间

    2023年04月11日
    浏览(83)
  • 【C++奇遇记】构造函数 | 初始化列表

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 🐤本篇文章将讲授C++的初始化列表相关的知识

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包