释放std :: list <cv :: mat> c ++的内存

时间:2018-01-25 16:05:27

标签: c++ list opencv memory free

我想释放包含cv :: Mat类型的列表容器的内存。我在这里阅读了很多内容并尝试了以下不起作用的内容:

std::list<Mat> images; // This is a static member object;

交换技巧:

std::list<Mat>().swap(images);

std::list<Mat> foo;
foo.swap(images);

擦除每个垫子:

for (std::list<Mat>::iterator it = images.begin(); it != images.end(); ++it)
{
    it  = images.erase(it);
}

发布每张Mat:

for (std::list<Mat>::iterator it = images.begin(); it != images.end(); ++it)
{
    it->release();
}

使用std :: list *指针:

delete std::list<Mat>* images;
images = new std::list<Mat>;

使用free()的每个Mat的可用内存:

for (std::list<Mat>::iterator it = images.begin(); it != images.end(); ++it)
{
    free(&(*it));
}
images.clear();

调整大小列表:

images.resize(0);
images.clear();

我无法在堆/范围中创建数据,因此它将在删除时被删除。它必须是一个静态成员对象。由于多次删除任意矩阵,向量也不适合我。

任何人都知道我可以做些什么来释放记忆?

2 个答案:

答案 0 :(得分:2)

将列表清除为images.clear()

请注意,C ++标准库和C堆分配器缓存内存并不会立即将其返回给操作系统。您可以尝试malloc_trim(0)调用以请求C堆分配器将内存返回给操作系统,但不需要遵守此请求。

答案 1 :(得分:1)

cv :: Mat :: deallocate()解除分配矩阵数据。

清除列表可能并非在每种情况下都释放cv :: Mat对象,因为cv :: Mat确实引用了count,如果你有其他具有相同数据(或子矩阵)的cv :: Mat对象,它们不会被解除分配。

一些评论: - 我想你的意思是std :: list?看到列表类型而不知道它是什么,这是非常令人困惑的。最好不要使用名称空间,尤其是在提问时。 - 虽然你做的大部分事情似乎都足够无害,但free()调用似乎非常可怕。永远不要使用free,除非你有一个malloc,并且最好完全避免使用C ++,这就是new和delete的用途。