跟踪内存泄漏

时间:2011-08-11 13:55:51

标签: c++ visual-studio-2010 visual-c++

情况:

关闭课程时,我看到增加了大约120k字节, 因此,当我关闭几次,几次内存增加 - 我需要找出造成这种情况的原因。

正在寻找有关如何找出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);
      }

    }
}

我刚刚做了一个小应用程序来初始化/取消类对象来查看 在'任务管理器'中如果我的应用程序的内存返回到它的起始值 - 但事实并非如此,它每次初始化cSomeClass时都会继续递增 - 所以我相信我有一些已初始化但未在Deinitialize中释放的内容。 / p>

更新

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

更新

感谢乍得 - 让它嗅到了

_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.

2 个答案:

答案 0 :(得分:3)

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

在追踪顽固的泄漏时,将此与_CrtMemCheckpoint结合使用可能非常重要。

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

答案 1 :(得分:0)

我不确定“关闭课程”究竟是什么意思,但是如果你能够在Linux中运行你的代码,那么valgrind始终是跟踪内存泄漏的绝佳选择。 Purify在Windows中运行良好,但它是$$。

另一种方法是尝试预先解决问题:使用智能指针而不是原始指针。

最后确保你实际上看到了泄漏而不仅仅是内存增长达到某个平台。