C/C++如何监测内存泄漏 您所在的位置:网站首页 c语言内存泄露检查工具 C/C++如何监测内存泄漏

C/C++如何监测内存泄漏

2023-10-28 00:47| 来源: 网络整理| 查看: 265

C/C++内存泄漏及检测

内存溢出就是内存越界。内存越界有一种很常见的情况是调用栈溢出(即stackoverflow),虽然这种情况可以看成是栈内存不足的一种体现。例如:递归调用栈;比如说C/C++标准库有个strcpy,会一直复制内存,直到遇到\0。;

内存泄漏就是内存申请后,用完没有释放,造成可用内存越来越少。

实际上很多内存泄漏对程序的运行不会有任何影响,有的内存泄漏,要连续不关机不重启电脑长达几十年的时间,才会被人觉察到。比如说电脑的内存有32GB,你程序分配了一块2KB的内存。而这块内存没有起任何作用,就一直放在那里。这就是内存泄漏的一种。有什么影响吗? 毫无影响。一般说内存泄漏是指分配了一块内存,用它存了一些东西,然后不再用它了,但并没有把这块内存释放掉。实际上只要程序退出了,不管泄漏不泄露,所有的内存一样会释放。

内存溢出比这严重多了。比如电脑有32GB的内存,32GB全用完了,这叫内存溢出。

不管内存泄漏与否,只要用了这么多内存,都会导致内存溢出。 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

“该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏,系统长时间运行之后,可用内存越来越少,甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用malloc失败,否则都不会导致任何问题。实际上,使用C/C++这类没有垃圾回收机制的语言时,你很多时间都花在处理如何正确释放内存上。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也会对程序造成重大的影响,如造成某些关键服务失败。

对于内存泄漏,本人深有体会!实习的时候,公司一个项目中就存在内存泄漏问题,项目的代码两非常大,后台进程也比较多,造成内存泄漏的地方比较难找。这次机会是我对如何查找内存泄漏问题,有了一定的经验,后面自己的做了相关实验,在此我分享一下内存泄漏如何调试查找,主要内容如下:

1、内存泄漏简介2、Windows平台下的内存泄漏检测 2.1、检测是否存在内存泄漏问题2.2、定位具体的内存泄漏地方3、Linux平台下的内存泄漏检测 4、总结

其实Windows、Linux下面的内存检测都可以单独开篇详细介绍,方法和工具也远远不止文中介绍到的,我的方法也不是最优的,如果您有更好的方法,也请您告诉我和大家。

  1、内存泄漏简介及后果

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

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

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

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

程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;泄漏在操作系统内部发生;泄漏在系统关键驱动中发生;内存非常有限,比如在嵌入式系统或便携设备中;当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

#include

#include

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

    char *str = NULL;

    GetMemory(str, 100);

    cout

    _CrtMemCheckpoint( &s1 );

    char *str = NULL;

    GetMemory(str, 100);

    _CrtMemCheckpoint( &s2 );

    if ( _CrtMemDifference( &s3, &s1, &s2) )

        _CrtMemDumpStatistics( &s3 );

    cout



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有