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

Release memory of std::list<cv::Mat> c++

我想释放包含 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);
}

释放每个垫子:

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();

我无法在堆/作用域中创建数据,所以它会在退出时被删除。它必须是静态成员对象。向量也不适合我,因为任意矩阵的多次删除。

有人知道我可以做什么来释放内存吗?

清除列表只是为了images.clear()

请注意,C++ 标准库和 C 堆分配器缓存内存并不会 return 它立即到 OS。您可以尝试 malloc_trim(0) 调用请求 C 堆分配器将 return 内存分配给 OS,但不需要满足此请求。

cv::Mat::deallocate() 释放矩阵数据。

清除列表可能不会在所有情况下都取消分配 cv::Mat 对象,因为 cv::Mat 会进行引用计数,如果您有其他 cv::Mat 对象具有相同的数据(或子矩阵),它们不会被释放。

几点说明: - 我想你的意思是 std::list?看到一个列表类型却不知道它是什么是非常令人困惑的。最好根本不要使用 using namespace,尤其是在提问时不要使用。 - 虽然您所做的大部分事情看起来都足够无害,但 free() 调用似乎非常可怕。除非你有 malloc,否则永远不要使用 free,最好在 C++ 中完全避免使用它,这就是 new 和 delete 的用途。