c++内存管理

要说c++内存管理,必须先研究一下c++的内存是如何分配的

  • 栈: 程序种执行的函数内的局部变量都是在栈上面创建的,函数执行结束这些存储单元会被自动释放。栈的内存分配时内置于指令集之中的,效率极高,但是由于寄存器的容量限制,所以栈内分配的容量十分有限。
  • 堆: 程序中使用new分配的内存块,它们的释放需要程序员去管理,编译器不负责。一个new要对应一个delete,若是程序员没有释放它们,程序结束后,操作系统会自动回收。
  • 自由存储区: 由malloc分配的内存,类似于堆,它们由free进行释放。
  • 全局/静态存储区: 全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  • 常量存储区: 这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
  • 总结: c++内存分配方式看完了,我们大概就可以知道c++程序中哪些变量时放在哪块内存里面了。

跟内存有关问题

野指针
  • 野指针不是NULL指针。
  • 指针没有被初始化,造成野指针。
  • 指针指向的对象已经被delete或free,然而使用的人不知道,还在使用。
  • 超出作用域的使用指针,这种情况下,指针也变成了野指针。
怎么杜绝野指针?
  • 用NULL指针初始化指针。
  • 当使用delete/free操作指针后,给指针赋NULL。
  • 在正确的作用域里使用指针。
常见的内存错误
  • 内存未分配成功,却使用他。内存未分配成功,指针的值使NULL。好习惯是判断分配内存的指针是否为NULL,然后再使用它。
  • 内存分配成功,但是未初始化,想当然的认为内存里的值应该是0.比如认为分配的数组初始值都是0,bool类型的值默认是false。这样都是不对的。好习惯是重新初始化分配好的内存,保证万无一失。
  • 内存分配成功,也初始化,但是操作超出内存边界的内存。这个就是属于误用,不是自己的不要用,管理好自己分配的内存就好。
  • 内存泄漏。一个函数中含有未释放的内存,每执行一次,内存泄漏一次,终有一次服务器的内存会消耗完。好习惯是,malloc和free成对出现,new和delete成对出现。
暂时就这么多,后面有空再写
  • 堆与栈的区别?
  • malloc/free与new/delete的区别?
  • 指针数组中,指针放在哪,数组放在哪?
  • 频繁的使用new/delete进行内存操作会有什么问题?
  • c++编译器栈区一般多大?
  • c++中堆的可分配空间有多大?什么是限制它大小的条件。
  • c++中全局/静态区的大小是固定的吗?会根据程序的情况动态分配吗?常量区也是如此吗?
  • c++自由存储区是不是也是从内存中分割出来的一部分?跟堆一样?有啥区别?
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值