★【C/C++】概念:内存泄露与内存泄露检测

内存泄漏的定义  一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。以下这段小程序演示了堆内存发生泄漏的情形:

  void MyFunction(int nSize)
  {
  char* p= new char[nSize];
  if( !GetStringFrom( p, nSize ) ){
  MessageBox(“Error”);
  return;
  }
  …//using the string pointed by p;
  delete[] p;
  }
  当函数GetStringFrom()返回零的时候,指针p指向的内存就不会被释放。这是一种常见的发生内存泄漏的情形。程序在入口处分配内存,在出口处释放内存,但是c函数可以在任何地方退出,所以一旦有某个出口处没有释放应该释放的内存,就会发生内存泄漏。

后果

内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
  内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
  在以下情况,内存泄漏导致较严重的后果:
  * 程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
  * 新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
  * 程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
  * 泄漏在操作系统内部发生;
  * 泄漏在系统关键驱动中发生;
  * 内存非常有限,比如在嵌入式系统或便携设备中;
  * 当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。

内存泄露检测
c++中检测内存泄漏可以引入系统定义的宏来查看,内存在哪个位置泄漏

文件开始处加入下列定义
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

程序退出时加入以下函数:

_CrtDumpMemoryLeaks();

如果有泄漏会显示
e:\myproject\mltithrd.14\mltithrd.cpp(95) : {68} client block at 0x00372550, subtype c0, 144 bytes long.
a CMultiDocTemplate object at $00372550, 144 bytes long

你可能感兴趣的:(★【C/C++】概念:内存泄露与内存泄露检测)