C++随记(二)---动态分配内存问题(1)

C++随记(二)---动态分配内存问题(1)

面向对象的编程的一个特点就是在运行阶段(而不是编译阶段)进行决策。运行阶段决策提供了灵活性,可以根据当时的情况进行调整。具有代表性的就是,可以在运行阶段分配内存。

C语言使用库函数malloc()来分配内存;C++中可以这么用,但是更为常用的就是用new运算符来分配内存,在了解new运算符时你最好已经知道C++的指针是怎么回事。

1、new的简单使用

先来看一个简单的例子:

例如通常情况下,我们需要创建一个指向int类型的指针,程序就会如下:

int a =1;

int *point = &a;

这样,在程序的编译阶段,int变量a的地址就会赋值给int类型的指针point。

如果,在程序运行阶段,为一个int值分配未命名的内存,程序就会如下:

int* point2 = new int;

等号左边表示我定义了一个指向int类型的指针,等号右边,我用运算符new开辟一个可以存储int类型数据的内存区域(因为不同类型的变量需要占用的内存不同),返回此区域的地址。

通过上面那行程序,我就得到了一个内存块,但是我并不知道此内存块的名字,因为我没有给它命名,但是,我知道这片儿区域的地址,point2. 如果我需要取得这个内存块中存储的值,可以用 *point2 , 这就相当于是一个int变量了

举一个通俗的例子来描述上述过程,比如我们通常都不知道我们寝室叫什么名字,因为通常我们不会给寝室取名字,开学的时候,我们去报道,首先明确类型,我是本科生,学校就分给我一个本科生的宿舍(4人间),然后返回此寝室的地址,比如1栋101:1101.然后以后要找我们寝室这四个人,都是直接说1101寝室的同学。

使用new开辟内存之后,你要记得最后要用delete来释放内存,比如你毕业了,就得卷铺盖卷从寝室搬出去,1101的四位同学都搬出寝室。否则将会发生内存泄漏(memory leak),就是说被分配的内存再也无法使用,1101的人不搬走,其他同学当然用不成这个寝室了。

类型名* point2 = new 类型名;

···;

Delete point2;

2、使用new来创建动态数组

对于大型数据,如数组、字符串、结构体,使用new才能真正体会到动态开辟内存的妙处。熟悉数组的朋友应该还记得,创建数组时,一定要明确数组的大小,否则无法成功创建,意味着数组是在编译的时候加入到程序中的,这叫做 静态联编。

而使用new时,我在程序运行时将视具体情况来决定我是否创建数组,并且可以选择其长度,这样的数字称之为 动态数组,此过程被成为 动态联编。 示例: int * points = new int[5]; delete [ ] points;//注意此处一定要有方框[ ],表示我释放的是这整个数组。 使用new和delete时的注意要点: New和delete应该成对出现; 不要用delete来释放不是new开辟的内存; `不要用delete释放同一个内存块两次; `如果用new[ ]为数组分配内存,一定要用delete[ ]来释放内存; `对空指针使用delete是安全的。

3、使用动态数组

int * points = new int[5]; 对于这样一个数组,points指向的是第一个元素的地址,如果要访问第一个元素,那么就可以直接*points。 那么如何访问第二个,第三个元素呢? 把points看成是一个数组!points[1]就是第二个元素,points[0]就是第一个元素,这是因为C++内部也使用指针来处理数组。详细分析会在下一篇博文介绍。 这里先提出一个和数组不一样的地方,对于本例的points来说,points+1后,这个地址对应的就是第二个元素了,points+2对应的就是第三个元素了,这样的加减是合法的。而且加减是以points 对应的类型 所占的字节数 为步长的,即points+1不是说地址的数值只加1,而是加了一个int的长度。 但是如果一个数组int Array[5],我们是不能对数组名Array进行加减的!即Array+1是非法的!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Vamei实验室

Python进阶01 词典

基础教程介绍了基本概念,特别是对象和类。 进阶教程对基础教程的进一步拓展,说明Python的细节。希望在进阶教程之后,你对Python有一个更全面的认识。 之前...

2018
来自专栏Crossin的编程教室

囚徒问题解答

前天提出了一个关于囚犯排队报数,谁能留到最后的问题: 一道囚徒问题 有人看出来,这是“约瑟夫环”问题的改编版,在网上可以搜到原版的问题,和很多种解法。 这里说一...

2739
来自专栏工科狗和生物喵

【计算机本科补全计划】链式存储线性表的一些相关操作

正文之前 不管怎么说,好歹是吧王道的第二章看完了!线性表算法写的我都快吐了,不过成果也是有的,可以写一些稍微复杂的算法了!感动,希望尽早达到老师的要求,然后去实...

2686
来自专栏苦逼的码农

从零打卡leetcode之day 1--两数之和

不过心里才两个循环时间复杂度可是n的平方,心想肯定得超时,不过还是大胆提交一下提交,呵呵,居然通过了。。。。

951
来自专栏机器学习实践二三事

单链表判断是否有环和环起始节点

面试的滴滴研究院暑期实习生,岗位机器学习,二面除了电话面还要视频面试写代码,两个问题: 单链表判断是否有环以及找出环开始的节点 建立二叉排序树并进行中序遍历 因...

1788
来自专栏决胜机器学习

PHP数据结构(七) ——串与实现KMP算法

PHP数据结构(七)——串与实现KMP算法 (原创内容,转载请注明来源,谢谢) 一、定义 串是0个或多个字符组成的有限序列,任意连续字符组成的子序列称为子串,...

3599
来自专栏ml

学习manacher(最长公共回文串算法)

   给定一个字符串求出其中最长个公共回文串. 举列子: abab   -->回文串长度为2 以前的算法诸如: 扩展kmp求法过于麻烦,看到有一篇博文(http...

2716
来自专栏Fundebug

代码面试需要知道的8种数据结构(附面试题及答案链接)

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

896
来自专栏C语言C++游戏编程

世界最强的编程语言:C语言

char:字符型,用来存储小范围的整数(-128~127)和字符(所有的ASCII字符,128个),一个字节。

542
来自专栏Python小屋

详解Python列表推导式

列表推导式可以使用非常简洁的方式对列表或其他可迭代对象的元素进行遍历和过滤,快速生成满足特定需求的列表,代码具有非常强的可读性,是Python程序开发时应用最多...

3024

扫码关注云+社区