【问题标题】:Memory leak despite destructor call using static unique_ptr尽管使用静态 unique_ptr 调用析构函数,但内存泄漏
【发布时间】:2013-12-06 14:12:03
【问题描述】:

我使用unique_ptr 作为静态数据成员来保存指针。

struct Test
{
    int i;
    ~Test()
    {
        cout << "destructed" << endl;
    }
};

struct S
{
    static unique_ptr<Test> te;
};
unique_ptr<Test> S::te = unique_ptr<Test>(new Test());

在程序终止时,S::te 被破坏,调用 Test-destructor。

但是 _CrtDumpMemoryLeaks 向我显示了 S::te.get() 的内存位置上的内存泄漏,这是指向(被破坏的)测试对象的指针。

我不明白这种行为。

我不能使用静态unique_ptr 吗? unique_ptr 实现虽然调用了析构函数,但为什么会有泄漏?

【问题讨论】:

  • 你是直接调用_CrtDumpMemoryLeaks吗?
  • 你的逻辑有问题。当一个工具报告您的代码中存在内存泄漏时,这并不一定意味着您的代码中存在内存泄漏。这也可能是泄漏检测工具中的缺陷或错误——或该工具的错误使用。在这种情况下,您的 unique_ptr不会泄漏内存。
  • 你能发布一个完整的工作示例
  • @jalf 那么,你能推荐另一个在 windows 下的 Visual Studio 2013 泄漏检测工具,它不是那么错误吗?
  • 不,我没有说该工具一定有故障。 (不是。但是您分配的内存在静态对象被销毁之前不会被释放。如果该工具在此之前检查泄漏,那么它将看到尚未释放的已分配内存块

标签: c++ memory-leaks static unique-ptr


【解决方案1】:

如果您在静态破坏发生之前尝试检查泄漏,就会发生这种情况。

要解决此问题,您可以在应用程序开头调用_CrtSetDbgFlag_CRTDBG_LEAK_CHECK_DF;静态销毁后,它会在退出时自动调用_CrtDumpMemoryLeaks

【讨论】:

  • 只有 _CRTDBG_LEAK_CHECK_DF 在默认输出上不显示任何内容,但 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) 效果很好,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 2013-11-28
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多