【问题标题】:False memory leaks in a MFC projectMFC 项目中的虚假内存泄漏
【发布时间】:2010-10-12 07:08:35
【问题描述】:

我有一个 MFC 项目,它链接到第三方 dll。在程序退出时,IDE 报告“检测到内存泄漏!”并转储泄漏。

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

有没有办法禁用内存泄漏检查,只针对那个 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;
};

在 dll 项目中,创建类 foo 的实例,范围为文件级别。

foo g_foo;

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

在MFC工程中,链接库,调用InitInstance()中导出的函数

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

【问题讨论】:

    标签: mfc memory-leaks


    【解决方案1】:

    找到我想要的。

    • 在项目属性对话框的链接器 | 下输入
    • 将 dll 指定为延迟加载的 DLL。

    完成此操作后,Visual Studio 不再报告任何内存泄漏。

    【讨论】:

    • 不是一个好的答案。它甚至没有解释问题是什么,或者这个答案如何解决它。如果您正在使用它,请准备好返回误报。
    【解决方案2】:

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

    【讨论】:

    • 不,他们不是。它们误报,原因是您无法(轻松)控制模块卸载的顺序。
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多