MFC项目中的虚假内存泄漏

use*_*810 4 mfc memory-leaks

我有一个MFC项目,即链接到第三方DLL.在程序退出时,IDE报告"检测到的内存泄漏!" 并倾倒泄漏.

这些泄漏来自第三方DLL.我很确定这些都被错误地报道了.(快速Google检查表明,在CRT销毁文件范围内的变量之前,MFC会检查内存泄漏.)

有没有办法禁用内存泄漏检查,只有该DLL?

回应到目前为止发布的答案

我不认为我滥用了API.我怀疑的行为可以用一个简单的项目来复制

  1. 使用VS2005
  2. 创建新的解决方案.
  3. 创建一个新项目(MFC应用程序.)
  4. 创建一个新项目(Windows 32项目,应用程序类型:DLL,导出符号)
  5. 在dll项目中,导出一个函数.
  6. 在dll项目中,按如下方式定义类Foo

这是代码

class foo
{
    public:
        foo(void)  { p = new int; };
        ~foo(void) { delete p; }
    private:
        int* p;
};
Run Code Online (Sandbox Code Playgroud)

在dll项目中,创建类foo的实例,在文件级别作用域.

foo g_foo;

// This is an example of an exported function.
TEMPDLL_API int exportedFunction(void)
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

在MFC项目中,链接到库,并在InitInstance()中调用导出的函数

运行应用程序时,即使p被删除,也会在调用g_foo的析构函数时报告内存泄漏.

use*_*810 6

找到了我想要的东西.

  • 在项目属性对话框中的"链接器"下 输入
  • 将dll指定为Delay Loaded DLL.

一旦我这样做,Visual Studio不再报告任何内存泄漏.

  • 这**不是**一个好的答案。它甚至没有解释问题是什么,或者这个答案如何解决它。如果您使用此功能,请做好误报返回的准备。 (2认同)

Aar*_*ela 5

那些泄漏是合法的.我会仔细检查DLL文档,以确保您没有错过对特定于DLL的清理函数的调用.