动态分配内存的危险(浅)
2017-01-19 本文已影响0人
Lucky宁
1、内存泄漏。
原因:代码中的错误导致。
2、内存碎片。
原因:动态分配内存时内存使用不当导致的。
内存泄漏:
使用new分配空间时,最后没有用delete释放它,导致它一直占用内存,发生内存泄漏。
例如,如果丢失了已经分配内存的堆内存地址,因为改写了用于访问它的指针中的地址。这是一个很常见的问题,比如循环中,不断向内存空间申请内存,在内存空间中消耗内存的越来越多,在分配完空间后,再次申请内存时,出现错误,申请内存失败。
解决或者说避免这个问题的办法,就是在用new分配完空间后,在恰当的位置释放内存。那什么是恰当的位置?恰当的位置就是在这块内存使用完,后面不再使用它时,将他释放。
拿指针举个例子,指针是有作用域的,作用域范围是从定义它的地址开始,到他结束,用完后这个指针就不存在了,但他所占的内存仍然存在,如果不及时的释放他,他就会一直占用内存,所以在指针的作用域结束的地方用delete释放他就行。
内存碎片:
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。
(1)、内部产生的碎片
内存分配必须起始于可被 4、8 或 16 整除,这就导致,我在申请23个内存时,电脑会给我批下24个内存,然后我还不用那1个内存,导致出现多个1内存。这一个内存就是多余的空间,叫做内部碎片。
(2)、外部产生的碎片
频繁的分配与回收物理页面会导致大量的、连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片。
如图:
但这个问题少见,只需稍加知道即可。