高CPU使用时,OpenCV可以堆积内存吗?

时间:2015-04-26 22:14:44

标签: c++ opencv

我正在研究代码中的内存堆积问题。

代码说明:
(1)实时读取网络摄像头的图像 (2)根据某些条件,将这些图像添加到std :: vector
(3)std :: vector传递到另一个线程来写一个视频文件。 (4)分辨率为720p,540p,360p。

问题:
- 尽管我在每个.avi文件写入后清除了std :: vector,但内存仍然堆积起来 - 一旦我清除了矢量,已经验证这些图像的参考计数降至零 - 只有在720p运行时才会发生上述情况。没见过540p,360p。

在调查了大量内存泄漏后,我还没有找到任何内容。

我注意到只有当CPU处于100%时才会出现此问题。在CPU使用率非常高的情况下,是否有可能无法运行OpenCV内存清理?有没有看过类似的问题?

任何见解都会有用 另外,了解OpenCV如何触发执行内存清理的例程会很有用。

1 个答案:

答案 0 :(得分:2)

C ++通常具有确定性的内存管理。也就是说,对垃圾收集线程没有基本需求。使内存符合重用条件的每个操作都已经与一个线程相关联 - 通常是在对象超出范围时运行的析构函数。

可能有一个线程正在运行,这简化了空闲内存列表,但这比理论上更重要。 OpenCV没有这样的线程,AFAICT,并且常见的编译器也不使用额外的线程。

所以我怀疑你是因为交换了因果关系。由于所有delete次呼叫都在运行,因此CPU达到100%。

问题也可能是由设计错误引起的。假设您有一个生成器线程,它创建图像并将它们添加到队列,以及一个消费者线程,它将图像从队列中取出。平凡地说,如果消费者线程以较低优先级运行,则当CPU达到100%时,它将首先被饿死。这也意味着队列将填满。但是在较低的分辨率下,有足够的CPU可供使用,因此消费者线程可以将队列保持为空。