好,这是基本事实,当我启动程序时,我会看到“任务管理器”总是一样的。
Memory(active private working set) Memory(private working set)
1,412K 1,412k
第一次启动时大约1M不错,这是一个稳定的数字。现在,我需要检查内存泄漏,以便执行以下操作。
_CrtMemState checkPt1, checkPt2, checkPt3;
_CrtCheckMemory();
_CrtMemCheckpoint(&checkPt1);
ClientSocket = INVALID_SOCKET;
ClientSocket = CurrentClass->AcceptIPV4();
if (ClientSocket != INVALID_SOCKET) {
thread (SubThread, CurrentClass, ClientSocket).join();
}
_CrtCheckMemory();
_CrtMemCheckpoint(&checkPt2);
_CrtMemDifference(&checkPt3, &checkPt1, &checkPt2);
_CrtMemDumpStatistics(&checkPt3);
_CrtMemDumpAllObjectsSince(&checkPt1);
现在,此工作正常,它根本不会占用我的线程。线程执行并获得报告,如下所示。
The thread 0x4470 has exited with code 0 (0x0).
8924 bytes in 22 Free Blocks.
0 bytes in 0 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 0 bytes.
Total allocations: 8924 bytes.
Dumping objects ->
Object dump complete.
这是好消息,我似乎分配的每个字节都被释放了。现在麻烦了,当我查看“任务管理器”时,看到以下内容。
Memory(active private working set) Memory(private working set)
1,652K 1,652k
仅运行一个线程后,这增加了全部225k。事实表明,每次执行此线程时,“任务管理器”都会增加大约225k。所以我是否泄漏内存。我在线程的每一行代码中都有它,在我使用malloc的任何地方都有一个空闲,在我使用new的任何地方都有一个带有删除的删除。有人可以指出我正确的方向吗?
如果在Linux上,我建议使用Valgrind;在Windows上,我建议使用Dr. Memory。 VS具有某种内存监视器,但我没有对其进行过多研究。 Memory博士为我工作得还不错,因为它类似于Valgrind。