【问题标题】:C++ Simple multithreading program memory leakC++ 简单的多线程程序内存泄漏
【发布时间】:2015-08-14 23:56:32
【问题描述】:

我编写了一个简单的代码,它应该创建 1000 个线程,完成一些工作,加入它们,然后重播所有内容 1000 次。

我的这段代码有内存泄漏,我不明白为什么。我几乎到处都在寻找解决方案,但找不到。

#include <iostream>
#include <thread>
#include <string>
#include <windows.h>


#define NUM_THREADS 1000

std::thread t[NUM_THREADS];

using namespace std;


//This function will be called from a threads
void checkString(string str)
{
    //some stuff to do
}

void START_THREADS(string text)
 {

    //Launch a group of threads
    for (int i = 0; i < NUM_THREADS; i++)
    {
        t[i] = std::thread(checkString, text);
    }


    //Join the threads with the main thread
    for (int i = 0; i < NUM_THREADS; i++) {

        if (t[i].joinable())
        {
            t[i].join();
        }

    }

    system("cls");
 }


int main() 
{

    for(int i = 0; i < 1000; i++)
    {
        system("cls");
        cout << i << "/1000" << endl;
        START_THREADS("anything");
    }


    cout << "Launched from the main\n";

    return 0;
}

【问题讨论】:

  • 你没有显示任何内存分配的代码,那怎么可能有内存泄漏呢?
  • 如何测量泄漏?
  • @Frophemida 如果内存消耗稳定,那么这不是内存泄漏。运行时库通常会保留已释放的内存,以防您稍后重新分配一些内存。这段代码 sn-p 中没有手动分配,所以很可能是发生了什么。
  • @Frophemida 我建议通过运行时分析器运行您的程序,它将报告任何未释放的内存。 Linux 有 Valgrind,here 是 Windows 的替代品列表。
  • 好吧,你不应该产生 100 万个线程。

标签: c++ multithreading memory-leaks


【解决方案1】:

我不确定内存泄漏,但你肯定有内存错误。你不应该这样做:

delete &t[i];

t[i] 没有分配给new,它不能是deleted。您可以安全地删除该行。

至于内存消耗,你需要问问自己是否真的需要生成 100 万个线程。生成线程并不便宜,而且您的平台不太可能同时运行多个线程。

【讨论】:

  • 谢谢,但您的回答并没有改变什么。我写那行是为了阻止内存泄漏,但忘了删除它。 :)
  • @Frophemida 确实如此。它从您的代码中删除了 未定义的行为。如果没有该更改,您的代码可以被认为是完全损坏的。你没有提供任何证据证明你有内存泄漏。
猜你喜欢
  • 2015-11-06
  • 2020-08-08
  • 2021-05-23
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2020-05-23
  • 2014-10-29
  • 2013-12-18
相关资源
最近更新 更多