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 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

C++接口继承与实现继承的区别和选择

《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现; ...

651
来自专栏木可大大

面向对象的演进过程

我们知道 程序 = 数据结构 + 算法,其中数据结构包括数组、栈、队列、链表、树以及图等,而算法是包含顺序、循环、分支三种逻辑结构的代码,为了使算法能够到处复用...

4219
来自专栏Java帮帮-微信公众号-技术文章全总结

第十一天 面向对象-接口多态【悟空教程】

1374
来自专栏ml

C与C++在const用法上的区别

       首先,C和C++在大体结构上不同,却在语法上相同。  所以在使用的时候,我们会时常遇到一些莫名其妙的问题,觉得语法上是正确的,但是编译的时候却出现...

3024
来自专栏C语言及其他语言

指针

1、地址与指针 Hi,欢迎来到指针的世界,也许您早已听过它的大名,指针被称为是C语言的精华所在。真正理解和掌握指针是征服C语言的关键所在! 在众多的计算机语言中...

2646
来自专栏木可大大

面向对象的演进过程

我们知道 程序 = 数据结构 + 算法,其中数据结构包括数组、栈、队列、链表、树以及图等,而算法是包含顺序、循环、分支三种逻辑结构的代码,为了使算法能够到处复用...

662
来自专栏Java Web

Java学习笔记(3)—— String类详解

前言 因为没有成功地为IDEA配上反编译工具,所以自己下载了一个XJad工具,背景是白色的,所以忍着强迫症硬是把IDEA的主体也给换成白色了,感觉为了这篇文章...

2655
来自专栏北京马哥教育

看完这篇文章还不懂Python中的闭包,请拍死小编

1544
来自专栏智能算法

Python学习(七)---- 面向对象学习(类)

原文地址: https://blog.csdn.net/fgf00/article/details/52449707 编辑:智能算法,欢迎关注!

692
来自专栏Java 源码分析

Java8新特性

1.HashMap 首先就是对 java 的 HashMap 进行了修改,以前是通过 hashCode 方法来判断他们的地址值是否一样 ,如果相同的话再使用 e...

3124

扫码关注云+社区