C++基本语言:1.4范围for、new内存动态分配、nullptr

C++基本语言包含10章节内容,存于C++从入门到精通专栏

目录

一、范围for语句:用于遍历一个序列

二、动态内存分配问题

c知识补充

C++知识

C语言的malloc和free

C++的new和delete

三、nullptr :C++11中引入的新关键词


一、范围for语句:用于遍历一个序列

我们可以不使用拷贝动作;直接采用引用的方式

二、动态内存分配问题

c知识补充

在c语言中,我们知道供(用户)程序使用的存储空间:程序区,静态存储区,动态存储区

程序执行所需的数据就放在静态存储区和动态存储区中,存储区就理解成内存

静态存储区:全局变量(在函数的外部定义的)放在静态存储区中,程序开始执行时给全局变量分配存储区,程序执行完毕后释放这些存储区。在程序执行过程中,占据着固定的存储单元,而不是动态的分配+释放

动态存储区:

(1)函数形参,函数形参被看作局部变量。

(2)局部变量,如函数内定义的一些变量。

(3)函数调用时,调用现场的一些数据和返回地址等。

一旦你调用完函数,返回去后这些内存就会被释放掉

一般来说,这些数据在函数调用开始时分配存储空间,函数调用完毕,这些空间就被释放掉了。这种分配和释放,我们就认为是动态的

如果你两次调用同一个函数,分配给此函数的局部变量等等的存储空间地址可能就是不同的。

C++知识

在C++中,把内存进一步更详细地分成5个区域:

在C++中,把内存进一步更详细地分成5个区域

1)栈。函数内的局部变量一般在这里创建,由编译器自动分配和释放

2)。由程序员使用malloc/new申请,free/delete释放。 malloc/new申请并使用完毕后要及时free/delete以节省系统资源,防止资源耗尽导致程序崩溃。如果程序员忘记free/delete,程序结束时会由操作系统回收这些内存。

(注意有些程序全年运行,别指望系统回收)

 

3)全局/静态存储区。全局变量和静态变量static放这里,程序结束时释放。

4)常量存储区。存放常量,不允许修改,如用双引号包含起来的 字符串“I love China”。

5)程序代码区。相当于C语言中的程序代码区。

这5个区域重点关注堆和栈。堆和栈都 相当于C语言部分所说的动态存储区,但用途不同。下面总结一下堆和栈 的区别

(1) 空间有限(这是系统规定的),使用便捷。例如代码行 int a=4;,系统就自动分配了一个4字节给变量a使用。分配速度快,程序员控制不了它的分配和释放

(2)堆 空间是程序员自由决定所分配的内存大小,大小理论上只要不超出实际拥有的物理内存即可,也在操作系统允许你分配的最大内存大小之内,都可以分配给你。

分配速度相对较慢,可以随时用malloc/new分配、free/delete释放,非常灵活。

 

C语言的mallocfree

C语言中,用mallocfree从堆中分配和释放内存;malloc和free()是函数;

malloc(memory allocation内存分配),动态内存分配

malloc的一般形式:

说明:

NumBytes:表示要分配的字节数;

void *是一个万能的类型的指针;也就是说void *可以被强制转换成任何其他类型指针。

要是分配成功就返回 指向被分配内存的指针,分配失败的话就返回NULL

分配成功后且当内存 不再使用时,应使用free()函数将内存释放。

free的一般形式:

该函数是将之前用malloc分配的内存空间还给程序或者操作系统,也就是释放先前分配的内存,这样这块内存就被系统回收并在需要 的时候由系统自由分配出去再使用

举例说明1:(point不指向空值)

举例说明2:

strcpy_s看起来有点熟悉,第1部分学习过strcpy函数,但这 里多了一个_s,代表的是strcpy函数的安全版本,能够检测所容纳的元素是否越界,如果越界则会停止程序运行并弹出警告窗口。

解释说明:

*q++;++与*优先级相同,从右到左结合

*(q++),q++是先用后加;

作用:得到q指向变量的值(*q),然后在使q指针自+1,指向下一个数组元素

C++的newdelete

C++语言中,用newdelete从堆中分配和释放内存

new和delete是运算符(标识符),不是函数。

C++中使用new和delete从堆中 分配和释放内存,两者成对使用。不再使用malloc和free来分配和释放内存(C++中不可使用)

new/delete做了和malloc/free同样的 事情——分配和释放内存,同时,new/delete还做了更多的事情。

new一般使用格式:

演示1:

演示2:new后面有圆括号,表示给这个空间值

演示三:new[];delete[];中括号配对使用,delete中括号内不用写数字

额外强调几点:

(1)配对使用,有malloc成功必有free,有new成功必有delete。

(2))free/delete不要重复调用,因为free/delete的内存可能被系统立即回收后再利用再free/delete一次很可能把不是自己的空间释放掉了,导致程序运行出现异常甚至崩溃

思考 malloc/free (C语言)和new/delete(C++)区别问题  -------(以后讲解)

简单来说,就是new/delete做了更多的初始化和释放工作

三、nullptr C++11中引入的新关键词

nullptr :代表“空指针”

注意:int a=nullptr;//报错,nullptr :代表“空指针”

           int b=null;//成功

使用nullptr能够避免在整数和指针之间发生混淆

使用typeid是打印类型名的;

结论: nullptr和null不是同一个类型;

            对于指针的初始化,能用nullptr的全部用nullptr。

           以往用到的与指针有关的NULL的场合,能用nullptr取代的全部用nullptr取代。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梆梆显眼梆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值