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

C++ 释放std::list的内存<;cv::Mat>;c++;,c++,list,opencv,memory,free,C++,List,Opencv,Memory,Free,我想释放包含cv::Mat类型的列表容器的内存。我在这里读了很多书,并尝试了以下方法,但都不起作用: std::list<Mat> images; // This is a static member object; 我无法在heap/scope中创建数据,因此它将在退出时被删除。它必须是静态成员对象。向量也不适合我,因为任意矩阵被多次删除 有人知道我能做些什么来释放内存吗?要清除列表,只需清除images.clear() 注意C++标准库和C堆分配器缓存内存,不立即返回到OS。您

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

std::list<Mat> images; // This is a static member object;
我无法在heap/scope中创建数据,因此它将在退出时被删除。它必须是静态成员对象。向量也不适合我,因为任意矩阵被多次删除


有人知道我能做些什么来释放内存吗?

要清除列表,只需清除
images.clear()


注意C++标准库和C堆分配器缓存内存,不立即返回到OS。您可以尝试调用

malloc\u trim(0)
请求C堆分配器将内存返回到操作系统,但不需要执行此请求

只清除列表中的图像。清除()

注意C++标准库和C堆分配器缓存内存,不立即返回到OS。您可以尝试调用

malloc\u trim(0)
请求C堆分配器将内存返回到操作系统,但不需要执行此请求

cv::Mat::deallocate()取消分配矩阵数据

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

几句话: -我想你指的是std::list?在不知道列表类型的情况下查看列表类型是非常令人困惑的。最好不要使用名称空间,尤其是在提问时。 -虽然您所做的大多数事情似乎都是无害的,但free()调用似乎非常可怕。永远不要使用免费的,除非你有一个Malc,最好在C++中完全避免它,这就是新的和删除的。 < P> CV::Mat::DeloLoad()释放矩阵数据。< /P> 清除列表可能不会在所有情况下解除分配cv::Mat对象,因为cv::Mat不进行引用计数,并且如果您有其他具有相同数据(或子矩阵)的cv::Mat对象,则不会解除分配它们

几句话: -我想你指的是std::list?在不知道列表类型的情况下查看列表类型是非常令人困惑的。最好不要使用名称空间,尤其是在提问时。
-虽然您所做的大多数事情似乎都是无害的,但free()调用似乎非常可怕。永远不要使用免费的,除非你有一个Malc,最好避免它完全在C++中,这就是新的和删除的。

你可能想说为什么你认为有些东西不起作用,即你得到的输出定义了错误。这会产生一个内存异常。至于其他的,在使用这些之后,内存就不可用了。您可能想说为什么您认为这些东西中的一些不起作用,例如,您得到了什么定义错误的输出。除了带有free()的部分之外,我没有得到任何错误。这会产生一个内存异常。对于其他的,在使用这些之后,内存就不可用了;不会释放内存,是吗?我想它只是将大小设置为0,但内存保持不变allocated@Ammy它解除分配给(内部)列表节点的内存。您可能会将其与
vector::clear
混淆,后者保留分配的数组以供重用。不管怎样,当一个容器被销毁时,它会释放它的所有内存!我在这个问题上花了很多时间。非常感谢你!关于操作系统内存:有没有办法告诉操作系统程序需要e。G5GB以上,因为它实际上在不使用malloc分配内存的情况下立即分别保留了该数量?@Ammy没有可移植的方式。但是.clear();不会释放内存,是吗?我想它只是将大小设置为0,但内存保持不变allocated@Ammy它解除分配给(内部)列表节点的内存。您可能会将其与
vector::clear
混淆,后者保留分配的数组以供重用。不管怎样,当一个容器被销毁时,它会释放它的所有内存!我在这个问题上花了很多时间。非常感谢你!关于操作系统内存:有没有办法告诉操作系统程序需要e。G5GB更多,因为它实际上立即分别保留了这个数量,而不使用malloc分配内存?@Ammy没有可移植的方法。我更正了我的问题。我只尝试了free(),因为我没有可能的解决方案了。我更正了我的问题。我只尝试了free(),因为我没有可能的解决方案了。
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();
}
delete std::list<Mat>* images;
images = new std::list<Mat>;
for (std::list<Mat>::iterator it = images.begin(); it != images.end(); ++it)
{
    free(&(*it));
}
images.clear();
images.resize(0);
images.clear();