跟踪内存泄漏

Tracking memory leak

本文关键字:泄漏 内存 跟踪      更新时间:2023-10-16

情况:

我看到大约+ 120kbytes增加时关闭类,因此,当我关闭类几次时,内存会增加-我需要找出导致这种情况的原因。

只是在寻找任何好的技巧或技巧,如何找到什么是不释放/发布与vstudio 2010 -任何想法?

这是我做的更清楚(非常简化)

class cSomeClass
{
 cSomeClass();
 ~cSomeClass();
  int Initialize();
  void Deinitialize();
}

cSomeClass cCamera;
    main()
    {
     Sleep(10000);
    // Do Init / Deinit to find out if we are freeing the memory
    while(1)
    {
      // Init camera
      if(cCamera.Initialize()==0)
      {
       // Rest for a while
       Sleep(1500);
       cCamera.Deinitialize();
       // Rest for a while
       Sleep(1500);
      }
    }
}

我只是做了一个小的应用程序来init/deinit类对象看看在"任务管理器",如果我的这个应用程序的内存返回到它的起始值-但它不是,它保持递增每次我初始化cSomeClass -所以我相信我有一些东西被初始化,但不释放在Deinitialize。

更新:

我不认为这是一个简单的内存增长,当应用程序启动时,它会在10秒后稳定下来,让我们说:1MB ram,然后当while(1)在每次Initialize I调用中启动时,我在整个应用程序内存中获得+120kBytes(在任务管理器中检查)。

更新:

Thanks to Chad - get its sniff with

_CrtDumpMemoryLeaks

Detected memory leaks!
Dumping objects ->
{76} normal block at 0x003F4BC8, 32 bytes long.
 Data: <Logitech QuickCa> 4C 6F 67 69 74 65 63 68 20 51 75 69 63 6B 43 61 
{75} normal block at 0x003F4B80, 8 bytes long.
 Data: < K?     > 20 4B 3F 00 00 00 00 00 
{74} normal block at 0x003F4B20, 32 bytes long.
 Data: < K?  K?         > 80 4B 3F 00 C8 4B 3F 00 CD CD CD CD CD CD CD CD 
{70} normal block at 0x003F4A30, 8 bytes long.
 Data: < )i     > 0C 29 69 00 00 00 00 00 
Object dump complete.

最直接的方法是使用Windows API函数跟踪内存使用情况,如_CrtDumpMemoryLeaks。

将此与_CrtMemCheckpoint结合使用可以证明在跟踪顽固泄漏时至关重要。

如果你正在使用MFC,你可以选择定义DEBUG_NEW,它为全局new/delete操作符添加了额外的跟踪,为每个泄漏的分配提供文件和行号,这也非常有用,但它不适用于new的某些实现(例如std::nothrow)。

我不确定您所说的"关闭类"究竟是什么意思,但是如果您能够在Linux中运行代码,那么valgrind始终是跟踪内存泄漏的一个很好的选择。Purify在Windows中也可以很好地工作,但是它是$$。

另一种方法是尝试预先阻止这个问题:使用智能指针代替原始指针。

最后,请确保您实际看到的是泄漏,而不仅仅是内存增长到某个平台。