C/C++的内存碎片、内存泄漏以及内存越界问题的解决方案

       内存问题一直以来都是C/C++开发中比较麻烦的问题,总的来讲,可以分成内存碎片、内存泄漏和内存越界这几类其中,以内存越界最为复杂,而且难以定位。下面我们将通过技术手段逐一分析并解决这三个问题。

一、操作系统的内存管理

进程的虚拟内存空间是地址是连续的,整个内存空间以页为单位进行划分,并不是每个页当前都映射了物理地址(commited),应用程序通过操作系统提供的API对内存进行管理,以页为单位,将虚拟内存地址映射到物理地址或者解除虚拟地址和物理地址的映射,某些情况下操作系统也会自动进行这个过程:例如当物理内存不足时,会根据一定的策略将部分虚拟空间的数据保存到硬盘上,同时解除虚拟空间和物理地址的映射,把空出来的物理地址映射到当前cpu需要访问的虚拟空间(拆东墙补西墙)。

一、内存碎片

        当应用程序通过操作系统提供的API动态的申请内存和归还内存,那么难以避免的就会造成当前已分配的内存在进程中占用着不连续的虚拟空间,反过来,不被应用程序占用的空闲内存空间也是不连续的,那么即便这些空闲内存的总量大于下次应用程序申请的空间大小,因为不连续,所以也无法成功申请到。空闲内存不连续的问题越严重(不连续的内存快越多,每块内存越小),分配不成功的概率就越大。

       我们通过以下几个技术手段解决这个问题:

      1、 建立小内存池机制,相同大小或者大小接近的内存都放到同一个内存池,这样从内存池的每个内存块之间浪费的内存会非常小或者没有浪费。

      2、内存池向系统申请内存时都以页为单位进行申请大块内存(Block),内存池对外分配内存也以优

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值