C++简单的new和delete线程及内存泄漏问题

4

我在我的代码中使用了线程并发,发现出现了一些内存泄漏问题,因此我尝试测试了下面这段简单的代码。

#include <thread>

void foo(){}

int main()
{
    for(; ;)
    {
        std::thread *th = new std::thread(foo)
        th->join();
        delete th;
    }
}

我在未更改任何设置的情况下使用VC++ Release模式进行了测试,并且我也发现了内存泄漏。当我使用Windows任务管理器检查该进程时,该程序的内存不断增加。
我认为我的代码中的delete没有起作用。是否有任何原因导致内存泄漏?
更多细节:
在检查注释和答案后,我运行了这个程序更多的分钟数。我发现测试程序在几分钟后不会再使用更多的内存。然而,我不确定为什么threaddelete之后会使用更多的内存(其他类不会),并且我的程序仍然会在几分钟后随着内存使用量的增加而关闭。在我的程序中,每个循环只使用11个thread,因此内存使用量增长缓慢,然后突然关闭。

7
你为什么要使用 newdelete 来创建线程?只需要使用 std::thread th(foo); 就可以了。 - juanchopanza
3
可能没有泄漏,但是不能信任任务管理器。请参阅任务管理器有多精确? - Bo Persson
4
那并不是使用 new 和 delete 的理由。 - juanchopanza
1
std::vector<std::thread> 可以正常工作。 - Quentin
1
@D.Lucit push_back 也可以将对象移动到向量内部,但最好使用 vec.emplace_back(/*args*/); 直接在向量末尾构造一个新线程。 - Quentin
显示剩余3条评论
1个回答

1
我认为操作系统无法如此快速地管理线程的内存。 1)间隔一段时间后检查相同的代码。 2)在Windows任务管理器中查看哪个统计列?检查“分配的内存”。

我还检查了Windows资源管理器(不能确定它是否准确),在内存选项卡中,我可以找到相同的内存使用变化。 - D. Lucit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接