我想释放包含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();
我无法在堆/范围中创建数据,因此它将在删除时被删除。它必须是一个静态成员对象。由于多次删除任意矩阵,向量也不适合我。
任何人都知道我可以做些什么来释放记忆?
答案 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的用途。