【发布时间】:2020-04-11 21:57:09
【问题描述】:
我主要是一名 Linux 开发人员,但是,我继承了一个存在内存泄漏的 windows dll。 我知道原因并相信我已经解决了它。 我想在单元测试中检查这一点。 单元测试使用内置的 cppunit 测试框架,它与我通常在 Linux 上使用的 cppunit 框架无关。 即
#include "CppUnitTest.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
我想做的是测量一段代码前后的内存使用情况,并检查它是否没有改变——这表明存在内存泄漏。或者类似地,检查分配器类型函数是否准确分配了后续析构函数类型函数释放的内存量。
是否有合适的 API 可以用来可靠地获取当前的内存使用情况?
我天真地尝试了以下方法:
size_t getMemoryUsage()
{
PROCESS_MEMORY_COUNTERS pmc;
auto processHandle = GetCurrentProcess();
if (GetProcessMemoryInfo(processHandle, &pmc, sizeof(pmc)))
{
return pmc.WorkingSetSize;
}
else
{
Assert::Fail(L"Unable to get memory usage for current process");
}
return 0;
}
这给了我当前进程的内存使用情况。不幸的是,这并不能准确地反映正在进行的分配和释放。我认为,如果我释放内存,操作系统可能仍会将其保留以供应用程序稍后使用。工作集是操作系统对进程的分配,而不是它在内部实际使用的内存。
我尝试通过What is private bytes, virtual bytes, working set? 将其更改为 PrivateUsage,但这似乎并不总是在 malloc 之后发生更改。
是否有合适的 API 可以为我执行此操作? 也许一个库可以像您在 Linux 上使用 LD_PRELOAD 那样替代已检测的 malloc? 见ld-preload-equivalent-for-windows-to-preload-shared-libraries
这里有几个类似的问题 - 例如memory leak unit test c++。
这个问题是针对在 Visual Studio 中使用 cppunit 对 DLL 进行单元测试的情况。
DLL 不会为可能被覆盖的分配器公开接口。我认为我的 目前最好的选择可能是添加一个。 如果有更简单的方法,我宁愿避免进行大量更改。 确认这是唯一方法的答案将被接受。
【问题讨论】:
标签: c++ visual-studio memory-leaks