C++学习笔记之内存管理

1 C++内存管理详解

在C++中,内存分为:栈、堆、自由存储区、全局/静态存储区、常量存储区。
栈:在执行函数时,函数内部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算置于处理器的指令集中,效率高,分配的内存容量有限。
堆:由malloc等分配的内存块,用free释放内存。
自由存储区:由new分配的内存块,由应用程序去控制。一般一个new就要对应一个delete。如果没有释放,那么在程序结束后,操作系统会自动回收。
全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在C语言中,全局变量分为初始化的和未初始化的,在C++中没有这个区分了,它们共用一块内存区。
常量存储区,这是一块比较特殊的存储区,它们里面存放的是常量,不允许修改。

1.1堆和自由存储区的区别和联系

堆是C语言和操作系统的术语,是操作系统维护的一块内存,而自由存储区是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储去并不等价。
new所申请的内存区域在C++中称为自由存储区。藉由堆实现的自由存储区,可以说new所申请的内存区在堆上。

1.2堆和栈的区别

1.2.1 管理方式

对于栈来说,是由编译器自动管理的,无需我们手动控制;对于堆来说,释放工作由程序员控制,容易产生内存泄漏。

1.2.2 空间大小

一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来说,一般都是有一定空间大小的,默认的栈空间大小是1M。

1.2.3 碎片问题

对于堆来讲,频繁的malloc/free势必会造成内存空间的不连续,从而造成大量的碎片,是程序效率降低。栈是先进后出的队列,以至于永远都不可能有一个内存从栈中间弹出。

1.2.4分配问题

栈是机器提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了站的效率比较高了。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数按照一定的算法在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间。这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低的多。

1.3关于内存的编程习惯

  • 用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
  • 不要忘记为数组和动态内存赋初值。防止将为被初始化的内存作为右值使用。
  • 避免数组或指针的下表越界,特别要当心发生“多1”或者“少1”操作。
  • 动态内存的申请与释放必须配对,防止内存泄漏。
  • 用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

参考文献

C++内存管理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值