new的问题究竟在哪里呢?实际上问题出在new和delete的结合使用上。考察下面程序中内存分配和释放过程:

while(1){
Big* p=new big;
  //......
Small* n1=new Small;
  //......
delete p;
Small* n2=new Small;
  //......
}

  在每个循环步中,我们创建了两个Small,在此期间,我们还分配了一个Big,然后又释放了它。考察这段代码,每执行一个循环步,我们可能期望“消耗” 2*sizeof(Small)个字节的内存(再加上动态内存分配的额外开销)。但实际上,每个循环步总会消耗更多的内存。如图:

可以看到,每执行一个循环步,动态内存中就会留下一些未用空间(“空洞”)。这些空洞可能只是几个字节大小,但如果我们不能加以有效利用,其危害与内存泄露是一样的。在内存中,空闲空间分散,形成很多小“空洞”,无法满足新的内存需求情况,就称为内存碎片。内存管理程序最终会把足够大的“空洞”用尽,只留下无法使用的小空洞。这是任何频繁使用new和delete的系统长期运行后都会遇到的一个严重问题。

最新文章

  1. Register DLL Assembly Gacutil.exe(全局程序集缓存工具)
  2. 设置代码Code高亮显示成蓝色
  3. js事件绑定细节说明
  4. 命令 crontab
  5. error: No resource identifier found for attribute ‘backIcon’ in package
  6. swift 有些语法还是不支持。
  7. Zepto.js-表单方法
  8. 【开源】NodeJS仿WebApi路由
  9. 507. Perfect Number
  10. TypeError:Error #1009
  11. Maths | 病态问题和条件数
  12. ESP8266-Arduino杀手?
  13. python第一章:简介与安装--小白博客
  14. MongoDB基础之 用户和数据库基于角色的访问控制
  15. ActiveMQ Transport Connectors
  16. Oracle 12C -- 基于sequence的列的默认值
  17. 51nod 1009 数字1的数量
  18. vue 知识点
  19. LAMP兄弟连 李强强 GVIM配置文件完整版
  20. 看oracle的sid

热门文章

  1. java调用python
  2. 1078 Hashing
  3. 命令提示符(cmd)中的tracert命令详解(小技巧)
  4. phpStudy启动失败时的解决方法 提示缺vc9运行库
  5. Python3.x 常用的新特性
  6. leetcode908
  7. 「小程序JAVA实战」运行微信官方demo(四)
  8. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial
  9. flask+jsonp跨域前后台交互(接口初体验)
  10. 数据预处理:PCA,SVD,whitening,normalization