C++ 多线程应用中进程大小的增长

C++ 多线程应用中进程大小的增长,c++,multithreading,C++,Multithreading,我需要一些解决办法来解决这个问题。 在我的应用程序的不同线程中新建和删除处理更多请求后,进程大小会不断增长而不会下降 Psudo代码: Main () { Thread1 enter Creating object and inserting into map. Thread1 exit Thread2 enter Itherating to the map and creating child thread based on the no of obj

我需要一些解决办法来解决这个问题。 在我的应用程序的不同线程中新建和删除处理更多请求后,进程大小会不断增长而不会下降

Psudo代码:

Main () {
    Thread1 enter
    Creating object and inserting into map.
    Thread1 exit

    Thread2 enter
    Itherating to the map and creating child thread based on the no of object in the map.
    Thread2 exit

    Child thread calling the function at the end deleting the object.
}
在Thread1中创建的对象在使用Thread2生成的子线程中删除

以上方法都可以。我犯了什么错误吗。 因为当地图上的物体数量增加时。 即使删除所有分配的对象并清除映射,进程大小也会快速增长。 谁能告诉我流程规模增长的原因是什么。
更新:


有最新消息。我已经用libumem工具(泄漏检测器)检查了流程。什么也看不出来

当传入流量和删除率相等时,进程大小不会增长。 只有在流量大的情况下,进程大小才会增加。 例子: 传入流量率为4000,删除率为100 进程大小会增加。 处理和删除所有请求后,预期进程大小会恢复正常,但不会恢复正常。 还有一个观察是我第一次发送10k请求 内存增加,但不会下降 然后我再次发送10k请求,这次进程大小没有增加。 在第一次迭代中增加的内存被重用。
它与操作系统行为有关吗?

这是标准库管理内存的方式。 从系统中获取内存非常昂贵,所以不会立即将其返回到系统,因为很快就会再次需要它

由于创建线程是一个昂贵的过程,所以线程也不会立即被释放。所以,当
std::thread
完成时,实际的线程将被移动到一个线程池中,以便将来重用

这种标准的库行为非常广泛和复杂

但是,如果您的程序不断增长(不要在某个级别停止), 那么您的应用程序中一定存在内存泄漏。
在这种情况下,我建议使用一些工具来检测内存泄漏,例如clang address sanitizer非常好。

这就是标准库管理内存的方式。 从系统中获取内存非常昂贵,所以不会立即将其返回到系统,因为很快就会再次需要它

由于创建线程是一个昂贵的过程,所以线程也不会立即被释放。所以,当
std::thread
完成时,实际的线程将被移动到一个线程池中,以便将来重用

这种标准的库行为非常广泛和复杂

但是,如果您的程序不断增长(不要在某个级别停止), 那么您的应用程序中一定存在内存泄漏。
在这种情况下,我建议使用一些工具来检测内存泄漏,例如clang address sanitizer非常好。

不要使用new和delete。它们的误用会导致内存泄漏。如果确实需要动态分配,请使用智能指针。如果必须使用“新建”和“删除”,请查找类似Valgrin的内存探查器。在映射中放置指向对象的指针,还是将对象复制到映射中?这种方法可以吗?创建临时线程闻起来很奇怪,它很少是使用它们的最佳方式。你犯了什么错误吗?如果是这样的话,它们可能在您的实现中,您还没有展示(尽管承认线程代码的for并不容易),我将对象放在mapDon't use new and delete中。它们的误用会导致内存泄漏。如果确实需要动态分配,请使用智能指针。如果必须使用“新建”和“删除”,请查找类似Valgrin的内存探查器。在映射中放置指向对象的指针,还是将对象复制到映射中?这种方法可以吗?创建临时线程闻起来很奇怪,它很少是使用它们的最佳方式。你犯了什么错误吗?如果是这样的话,它们可能在您的实现中,您还没有展示(尽管承认线程代码的for并不容易),我将对象放在map中