释放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 的用途。
我想释放包含 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 的用途。