Visual Studio 2010 SP1,32位exe,Dell Core i7。
为澄清而编辑:
我在生产代码中追逐一个小内存泄漏。它使用在工作线程上执行的lambda将事件分派给侦听器。以下是泄漏是如何引起的蒸馏示例。如果你让它运行足够长(几分钟),这个样本就会泄漏。谁能告诉我为什么?我确定当它被指出时我会踢自己。感谢。
#include "stdafx.h"
#include <process.h>
#include <cassert>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////
template <class Func>
static void __cdecl WorkerThreadProc(void* pData) {
assert(pData != nullptr);
Func* pFunc = static_cast<Func*>(pData);
(*pFunc)(); // Execute the task.
delete pFunc; // Clean up.
}
//////////////////////////////////////////////////////////////////////////
template <class Func>
static void BeginThread(Func fn) {
Func* pFn = new Func(fn);
if (_beginthread(WorkerThreadProc<Func>, 0, pFn) == -1L) {
errno_t err;
_get_errno(&err);
assert(false);
delete pFn; // Clean up.
}
}
//////////////////////////////////////////////////////////////////////////
int main(int, char**)
{
printf_s("CTRL-C to quit:\n");
while (true) {
BeginThread( []()->void{} ); // Launch worker to execute task.
}
return 0;
}
答案 0 :(得分:1)
编辑2:自从回答这个问题以来,问题已经改变了。我按原样留下答案,但请注意,它已经不再与(现在已更改)的问题非常相关。
<小时/> 不知道有任何泄漏,但new
和void*
丢失类型信息的内容完全不需要。
所以,只需删除那些东西。
否new
=无泄漏。
此外,对于保证new
的情况,请使用智能指针进行清理。
这也有助于防止内存泄漏(虽然不能保证只是没有new
,但是,你可以在Java中发生内存泄漏,这让许多Java程序员大吃一惊)。
main
函数创建线程的速度比线程可以执行和关闭的速度快,你会看到看起来像是漏洞的东西”,可能会突然发现内存泄漏。