怎么new一个指针_C++ 指针:内存管理,收放成双

14.内存管理与分配

bdd572b7bbc5ca89cc783bd998be871c.png

14.1 内存划分

安全和性能是C++程序员时刻要注意的事。

C++可以动态分配计算机内存,内存的管理也是C++语言中最容易出错的领域,所以你只有了解内存的工作原理,才能写出高质量的代码。

在C++中内存分为5个区,分别是堆、栈、全局/静态存储区、常量存储区和代码区。

栈:保存局部变量。栈空间用来存放函数运行时的参数值和局部变量,当一个函数运行结束时,在这个函数中声明的局部变量也会自动销毁。栈的特点是无需人工管理但空间大小有限。

堆:由malloc(C++程序员因避免使用)或者new运算符分配的内存。其生命周期由free(和malloc对应)或delete(释放new分配的空间)决定。堆中占用的空间在没有释放之前会一直存在,直到程序结束。堆的特点是自由度高,空间比较大,但程序员必须通过代码释放,容易出错。

静态区:保存全局变量和static变量(包括static全局和static局部变量)。静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。

常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量(const),不允许修改。

代码区:存放函数体的二进制代码。

14.2 内存分配

不同的变量系统分配给它的内存空间是不同的。

750fc0f84c8151e78cc6c4a9615d8bd6.png

上图中有main和add两个函数,在main和add函数中声明了若干变量,这些变量的内存分配如图中注释所言。

特别要提醒的是第25行与其他行变量分配方式完全不同。

14.3 分配堆内存

C++程序员可以灵活使用"巨大的"堆内存空间,在程序运行期间做到动态使用动态回收。

很多时候,你无法提前预知程序运行时需要多少内存来存储数据,为变量分配的内存大小需要在运行时才能确定。

在 C++语言中,程序员可以使用一个神奇的工具在程序运行期间给变量分配任意大小的堆内存空间。这个工具就是new运算符。

1.给变量动态分配堆内存

886ff5609926c3c461ea9009534d56dc.png

new运算符不仅会分配大小正确的内存空间,而且还会返回新空间的地址,最后地址信息被保存在=前面声明的指针中。

2.给数组动态分配堆内存

3e239f343488eff87b173660045b573c.png

上图中 new [ ]在堆内存中开辟了可以存放100个float类型数据的空间,[ ]中的数字决定了数组的长度。组数中每个空间的地址可以通过数组地址+数组下标的方式得到。

值得一提的是数组所有元素在堆内存的地址都是前后相邻的,只要上一个元素的地址+1就可以访问到下一个元素。

14.4 释放堆内存

如果你不再需要动态分配的堆内存空间了,可以使用 delete 运算符,删除之前由 new 运算符分配的内存。delete 指针,就可以释放这个指针指向的堆内存地址。

25645d0f79f36a62e8366c7eaed23435.png

记得要删除所有new出来的指针指向的内存。万一哪个程序员忘记了释放,会导致这块堆内存被持续占用,而无法被其他程序使用。

delete之后,还有一步操作:指针=0;指针赋值为0表示让这个指针不指向任何有效的地址。这步操作极易被忽视而导致程序不可预知的严重错误。

357adc71e219fc3b15070fd7274ccf77.png

释放堆中的数组空间需要正确完成:delete [] 指针;少写了[ ],会发生数组长度-1个空间的内存泄漏。

内存泄漏是C++编程中最常犯的错误,只有勤加练习才能减少犯错的可能性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值