VS2010报告DLL中静态类的错误内存泄漏

And*_*rey 6 c++ memory-leaks visual-studio-2010

从Visual Studio DLL调用ITK时内存泄漏的后续问题

我把问题提炼到最简单的例子.

struct A
  {
  public:
    A()
      {
      mp_data = new int(0x42);
      }
    ~A()
      {
      delete mp_data;
      }
    int* mp_data;
  };

A a;
Run Code Online (Sandbox Code Playgroud)

在DLL中定义此类全局类时,Visual Studio调试CRT报告在应用程序关闭时泄漏mp_data.除了禁用泄漏报告外,有没有人知道解决方法?

sme*_*lin 5

如果您_CrtDumpMemoryLeaks()在main函数的末尾调用,则行为是预期的,因为mp_data_CrtDumpMemoryLeaks()调用之后将被删除.

你需要在调用_CrtDumpMemoryLeaks()静态对象的最后一个析构函数之后调用(或者更确切地说,在内存释放后的最后一个析构函数中),如果你不想看到这些泄漏(非常困难的任务,我不会尝试).

更干净的方法是在堆上分配所有静态对象(在开头main),并在结束时释放它们main,然后你可以调用_CrtDumpMemoryLeaks()并且不会看到任何内存泄漏.

具有构造函数和析构函数的FYI静态对象被认为是坏的,因为它们构造/解构的顺序不是确定性的,并且因为静态对象经常引入无法容易调试的错误.

编辑关于Andrey的评论: 您可以尝试_CrtDumpMemoryLeaks通过调用_CrtSetDbgFlag来取消激活自动调用以取消设置_CRTDBG_LEAK_CHECK_DF标志.如果可行,您可以添加一个静态对象,该对象_CrtDumpMemoryLeaks()在其析构函数中调用.要确保最后销毁此对象,可以使用#pragma init_seg(编译器)指令.

不知道这是否有效...除此之外,所有其他解决方案很可能都需要您修改ITK库(应该可以,它毕竟是一个开源库?!).