广州C/C++培训
达内广州岗顶中心

18087159764

热门课程

如何处理C/C++内存泄漏及检测

  • 时间:2015-12-31
  • 发布:dn
  • 来源:dn

wikipedia中这样定义内存泄漏:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。 只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。 更糟的是,泄漏的程序可能会用掉太多内存,以致另一个程序失败,而使用户无从查找问题的真正根源。 此外,即使无害的内存泄漏也可能是其他问题的征兆。

内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。

在以下情況,内存泄漏导致较严重的后果:

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

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

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

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

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

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

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

下面我们通过以下例子来介绍如何检测内存泄漏问题:

#include <stdlib.h>

#include <iostream>

using namespace std;

void GetMemory(char *p, int num)

{

p = (char*)malloc(sizeof(char) * num);

//使用new也能够检测出来

}

int main(int argc,char** argv)

{

char *str = NULL;

GetMemory(str, 100);

cout<<"Memory leak test!"<<endl;

//如果main中存在while循环调用GetMemory

//那么问题将变得很严重

//while(1){GetMemory(...);}

return 0;

}

实际中不可能这么简单,如果这么简单也用不着别的方法,程序员一眼就可以看出问题,此程序只用于测试。

上一篇:知识解答:C 和 C++ 的没落
下一篇:C++标准库发展历史

C++语言编程的学习

C语言和C++区别 你知道多少

C/C++/JAVA那个更好的作为入门语言

C++语言的15个晦涩特性 由浅入深

选择城市和中心
贵州省

广西省

海南省

台湾