可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?

Posted

技术标签:

【中文标题】可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?【英文标题】:Possible to hide safe memory leak from leak detection in visual studio? 【发布时间】:2014-07-10 21:37:16 【问题描述】:

有什么方法可以在 Visual Studio 的正常内存检测中隐藏安全的内存泄漏?

我正在使用此调试标志检测内存泄漏:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

我只是花了很多时间来了解如何在 C++ 项目中嵌入 Boost.Python。它工作得很好,我对我将拥有的灵活性印象深刻。所有的努力终于得到了回报。也就是说,直到我魂飞魄散地意识到,Python 集成存在内存泄漏。这似乎是一个已知问题,不会修复Does the Python 3 interpreter leak memory when embedded?。由于内存泄漏保持不变,他们说可以安全地忽略它。但是,在 Visual Studio 中使用泄漏检测对我来说是一个巨大的帮助,而且每次运行程序时都会出现误报,这将使检测真正的内存泄漏变得更加困难。我不想放弃,但我不想放弃蟒蛇。

有什么办法可以隐藏内存泄漏吗?将代码包装在静态库、DLL、单独的进程中,什么?!如果我听起来很绝望,那是因为那非常接近我的感受。 ;)

【问题讨论】:

您想隐藏特定代码片段的内存泄漏,还是由放置在另一个库中的某些第三方代码造成的泄漏? 【参考方案1】:
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) & ~_CRTDBG_ALLOC_MEM_DF);

// allocations here are ignored by memory leaks tracker

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF);

// memory leaks tracking continues

将内存泄漏跟踪恢复到其原始状态的通用版本:

int flags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
_CrtSetDbgFlag(flags & ~_CRTDBG_ALLOC_MEM_DF);

// allocations here are ignored by memory leaks tracker

_CrtSetDbgFlag(flags);

// memory leaks tracking returns to its original state

【讨论】:

第二个_CRTDBG_ALLOC_MEM_DF前面也应该是一个'_'。这是一个非常明显的错误,但也许您应该修复它以确保完整性。 已修复,是剪切粘贴错误。谢谢。

以上是关于可以在 Visual Studio 的泄漏检测中隐藏安全的内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio vc++的静态代码内存泄漏检测

Visual Studio 内存泄漏检测不打印文件名和行号

如何使用 Visual Studio 的 sonarlint 扩展检测新引入的代码气味/泄漏

在 Visual C++ (Windows) 中检测内存泄漏

使用 Android Studio 检测内存泄漏与解决内存泄漏问题

基于Android Studio的内存泄漏检测与解决全攻略