c ++程序潜在的内存泄漏

时间:2017-08-13 03:15:53

标签: c++ multithreading memory-leaks std

我每隔40ms调用以下void function()函数,我发现内存消耗稳定增加。消费开始并不明显,但几天之后消费量巨大。任何人都可以帮助解释这段代码的错误。是线程问题还是导致内存泄漏的std::move问题。

void do_task(const std::vector<int>& tmp)
{
    // do some work here
}

void function()
{
    std::vector<std::thread> task;
    std::vector<int> tmp1, tmp2;

    GetTempValue(tmp1);
    GetTempValue(tmp2);

    task.push_back(std::thread(do_task, std::move(tmp1)));
    task.push_back(std::thread(do_task, std::move(tmp2)));

    tmp1.clear();
    tmp2.clear();

    UpdateTempValue(tmp1);
    UpdateTempValue(tmp2);

    task.push_back(std::thread(do_task, std::move(tmp1)));
    task.push_back(std::thread(do_task, std::move(tmp2)));

    tmp1.clear();
    tmp2.clear();

    for(int i=0; i<task.size(); i++)
    {
        task[i].join();
    }
}

2 个答案:

答案 0 :(得分:1)

传递对线程的引用是一个很大的禁忌。或者至少还有一个等待发生的错误...

您应该尝试重新定义do task以按值接受std :: vector。是不是你试图通过调用std :: move将它们传递给线程来做什么?

将do_task的定义更改为:

void do_task(std::vector<int> tmp);

我做了一些快速的计算。如果由function()启动的线程泄漏,每40ms启动4个线程,则泄漏率应超过1.4MB /小时。如果您的泄漏率低于此值,您应该开始寻找代码中的其他位置。

在任何情况下,每秒启动100个线程并不是很有效。在创建线程时,您的大部分计算能力都会丢失。你考虑过其他选择吗?

让4个线程运行无限循环,并将工作排队到它们将更有效率,减少对操作系统的负担,并且不易出现无法控制的泄漏。

答案 1 :(得分:-1)

我认为openmp可能是有趣的。 OpenMP是用于开发并行应用程序的API。

https://en.m.wikipedia.org/wiki/OpenMP