我是否漏了记忆?
Am I leaking memory or not?
好的,这是基本事实,当我启动程序时,我查看"任务管理器",它总是相同的。
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 锁定当前堆时,会出现这种情况。
顺便说一句,我根本没有记忆损失....
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 我是否漏了记忆?
- 我是否以错误的方式使用记忆屏障
- 在C++的松弛记忆模型中是否存在具有依赖周期的非因果行为
- C :当居民记忆缓慢增加时,是否存在内存泄漏
- 是否有一种记忆有效的方法来探索从输入排列产生的解决方案
- 派生类对象是否包含基类的私有成员?它在记忆中是什么样子的
- 记忆屏障是否适用于此锁
- 记忆的屏障,不确定我是否可以使用放松