C++内存泄漏和内存碎片的产生及避免策略

1.内存泄漏的定义

2、内存泄漏的后果

程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);

新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;

程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;

泄漏在操作系统内部发生;

泄漏在系统关键驱动中发生;

内存非常有限,比如在嵌入式系统或便携设备中;

当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

3、如何发现内存泄漏

ps-aux

静态分析,包括手动检测和静态工具,是代价最小的方法。

BEAM支持以下平台:

Linuxx86(glibc2.2.4)

Linuxs390/s390x(glibc2.3.3orhigher)

Linux(PowerPC,USS)(glibc2.3.2orhigher)

AIX(4.3.2+)

Window2000以上

或者使用内嵌程序自动检测

2、动态运行检测

实时检测工具主要有valgrind,Rationalpurify等。

1、Valgrind

读写已经释放的内存

读写内存块越界(从前或者从后)

使用还未初始化的变量

将无意义的参数传递给系统调用

内存泄漏

2、Rationalpurify

CC=purifygcc

./purifyplus_setup.sh

purifyg++-gtest3.cpp–otest

./test

4、如何避免内存泄漏

要避免内存泄漏可以总结为以下几点:

2、一遍又一遍的看代码,希望能看出内存泄露的bug

6、代码规模超过千万行,内存从一个模块被传递到另一个或多个,谁知道传递给哪个模块,最后在那里释放的了,反正我保证那个指针指向的数据是好的就行了。由于代码的规模,穷举式的测试根本不可能,只有一遍一遍的看代码,祈祷自己的代码没有内存泄露的问题。

内存碎片

1、什么是内存碎片

内存碎片—描述一个系统中所有的不可用的空闲内存;这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用。这一问题通常都会发生,原因在于空闲内存以小而不连续方式出现在不同的位置。由于分配方法决定内存碎片是否是一个问题,因此内存分配器在保证空闲资源可用性方面扮演着重要的角色。

2、内存碎片产生的原因

  外部碎片的产生是当已分配内存块之间出现未被使用的差额时,就会产生外部碎片。例如,一个应用程序分配三个连续的内存块,然后使中间的一个内存块空闲。内存分配程序可以重新使用中间内存块供将来进行分配,但不太可能分配的块正好与全部空闲内存一样大。倘若在运行期间,,内存分配程序不改变其实现法与四舍五入策略,则额外开销和内部碎片在整个系统寿命期间保持不变。虽然额外开销和内部碎片会浪费内存,因此是不可取的,但外部碎片才是嵌入系统开发人员真正的敌人,造成系统失效的正是分配问题。

3、内存碎片的弊端与优点

缺点:

大量的内存碎片会使系统缓慢,原因在于虚拟内存的使用会使内存与硬盘之间的数据交换称为系统

优点:

减少内存碎片,提高分配速度,便于内存管理,防止内存泄露

4、如何避免内存碎片的产生

2,分配内存和释放的内存尽量在同一个函数中

4,使用内存池来减少使用堆内存引起的内存碎片

5、尽可能少地申请空间。

6尽量少使用堆上的内存空间~

让我们从自身的禁锢中放心地飞出去,重新审视自己,

C++内存泄漏和内存碎片的产生及避免策略

相关文章:

你感兴趣的文章:

标签云: