动态分配内存的危险(浅)

1、内存泄漏。
原因:代码中的错误导致。
2、内存碎片。
原因:动态分配内存时内存使用不当导致的。

内存泄漏:
使用new分配空间时,最后没有用delete释放它,导致它一直占用内存,发生内存泄漏。
例如,如果丢失了已经分配内存的堆内存地址,因为改写了用于访问它的指针中的地址。这是一个很常见的问题,比如循环中,不断向内存空间申请内存,在内存空间中消耗内存的越来越多,在分配完空间后,再次申请内存时,出现错误,申请内存失败。
解决或者说避免这个问题的办法,就是在用new分配完空间后,在恰当的位置释放内存。那什么是恰当的位置?恰当的位置就是在这块内存使用完,后面不再使用它时,将他释放。
拿指针举个例子,指针是有作用域的,作用域范围是从定义它的地址开始,到他结束,用完后这个指针就不存在了,但他所占的内存仍然存在,如果不及时的释放他,他就会一直占用内存,所以在指针的作用域结束的地方用delete释放他就行。

内存碎片:
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。

(1)、内部产生的碎片
内存分配必须起始于可被 4、8 或 16 整除,这就导致,我在申请23个内存时,电脑会给我批下24个内存,然后我还不用那1个内存,导致出现多个1内存。这一个内存就是多余的空间,叫做内部碎片。

(2)、外部产生的碎片
频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。
如图:

自由储存区的碎片

但这个问题少见,只需稍加知道即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是...
    一生信仰阅读 1,224评论 0 2
  • (JG-2014-08-20)(前半部分经过网上多篇文章对比整理)(后半部分根据ExceptionalCpp、C+...
    JasonGao阅读 5,643评论 2 23
  • 前言 因为node绝大多数时间都是运行在后端的服务器程序,因此,需要精确控制内存。在以前,js程序员不需要控制内存...
    白昔月阅读 5,737评论 5 11
  • 被文同时发布在CSDN上,欢迎查看。 APP内存的使用,是评价一款应用性能高低的一个重要指标。虽然现在智能手机的内...
    大圣代阅读 4,889评论 2 54
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,427评论 0 6