我是否漏了记忆?

Am I leaking memory or not?

本文关键字:记忆 是否      更新时间:2023-10-16

好的,这是基本事实,当我启动程序时,我查看"任务管理器",它总是相同的。

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 它都有一个免费的,无论我在哪里使用新的它都有一个删除,它会消失。有人能指出我正确的方向吗?

我建议在Linux上使用Valgrind,如果在Windows上使用Dr. Memory。VS有某种内存监视器,但我没有过多地研究它。记忆博士对我的工作还不错,因为它与瓦尔格林德相似。

答案是你必须调用 EmptyWorkingSet(GetCurrentProcess(((; 这个函数为"任务管理器"给出正确的数字。否则,"任务管理器"不会捕获所有释放的内存。大多数情况下,当您使用线程 ID 锁定当前堆时,会出现这种情况。

顺便说一句,我根本没有记忆损失....