我有一个用 C++ (VS2010) 编写的多线程 Win32 服务,它广泛使用了标准模板库。程序的业务逻辑运行正常,但是在查看任务管理器(或资源管理器)时,程序像筛子一样泄漏内存。
我有一个测试集,平均每秒大约 16 个并发请求。当程序第一次启动时,它会消耗大约 1.5Mb 的内存。在完整的测试运行(需要 12-15 分钟)之后,内存消耗最终接近 12Mb。通常,对于运行一次然后终止的程序来说,这不是问题,但该程序旨在连续运行。非常糟糕,确实。
为了尝试缩小问题范围,我创建了一个非常小的测试应用程序,它以每 250 毫秒一次的速度分离工作线程。工作线程创建一个地图并用伪随机数据填充它,清空地图,然后退出。这个程序也以类似的方式泄漏内存,所以我认为问题在于 STL 没有按预期释放内存。
我尝试过 VLD 来搜索泄漏,它找到了一些我已经补救的问题,但问题仍然存在。我尝试过集成 Hoard,但这实际上使问题变得更糟(我可能没有正确集成它,但我看不出如何)。
所以我想提出以下问题:是否可以在不会泄漏内存的多线程环境中创建使用STL的程序?在上周的过程中,我对该程序进行了不少于 200 次更改。我已经绘制了更改的结果,它们都具有相同的基本配置文件。我不想删除所有使开发这个应用程序变得如此容易的 STL 优点。我非常感谢任何关于如何让这个应用程序正常工作而不会像它过时那样泄漏内存的建议。
再次感谢任何帮助!
PS我发布了一份记忆测试的副本,以供检查/个人教育。
#include <string>
#include <iostream>
#include <Windows.h>
#include <map>
using namespace std;
#define MAX_THD_COUNT 1000
DWORD WINAPI ClientThread(LPVOID param)
{
unsigned int thdCount = (unsigned int)param;
map<int, string> m;
for (unsigned int x = 0; x < 1000; ++x)
{
string s;
for (unsigned int y = 0; y < (x % (thdCount + 1)); ++y)
{
string z = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
unsigned int zs = z.size();
s += z[(y % zs)];
}
m[x] = s;
}
m.erase(m.begin(), m.end());
ExitThread(0);
return 0;
}
int main(int argc, char ** argv)
{
// wait for start
string inputWait;
cout << "type g and press enter to go: ";
cin >> inputWait;
// spawn many memory-consuming threads
for (unsigned int thdCount = 0; thdCount < MAX_THD_COUNT; ++thdCount)
{
CreateThread(NULL, 0, ClientThread, (LPVOID)thdCount, NULL, NULL);
cout
<< (int)(MAX_THD_COUNT - thdCount)
<< endl;
Sleep(250);
}
// wait for end
cout << "type e and press enter to end: ";
cin >> inputWait;
return 0;
}