几分钟后动态分配的工作线程泄漏,但不应该

时间:2012-09-24 11:37:28

标签: c++ memory-leaks

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;
}

1 个答案:

答案 0 :(得分:1)

编辑2:自从回答这个问题以来,问题已经改变了。我按原样留下答案,但请注意,它已经不再与(现在已更改)的问题非常相关。

<小时/> 不知道有任何泄漏,但newvoid*丢失类型信息的内容完全不需要。

所以,只需删除那些东西。

new =无泄漏。

此外,对于保证new的情况,请使用智能指针进行清理。

这也有助于防止内存泄漏(虽然不能保证只是没有new,但是,你可以在Java中发生内存泄漏,这让许多Java程序员大吃一惊)。

<小时/> 编辑:我认为@interjay's comment,“如果你的main函数创建线程的速度比线程可以执行和关闭的速度快,你会看到看起来像是漏洞的东西”,可能会突然发现内存泄漏。