【问题标题】:Release memory of std::list<cv::Mat> c++释放 std::list<cv::Mat> c++ 的内存
【发布时间】:2018-01-25 16:05:27
【问题描述】:

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

我无法在堆/范围内创建数据,所以它会在它消失时被删除。它必须是静态成员对象。向量也不适合我,因为多次删除了任意矩阵。

谁知道我可以做些什么来释放内存?

【问题讨论】:

  • 您可能想说明为什么您认为其中一些方法不起作用,即您得到什么输出来定义错误。
  • 我没有收到任何错误,除了带有 free() 的部分。这会产生内存异常。关于其他的,使用这些后内存不可用。

标签: c++ list opencv memory free


【解决方案1】:

清空列表只给images.clear()

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

【讨论】:

  • 但是 .clear();不会释放内存,是吗?我认为它只是将大小设置为 0,但内存保持分配状态
  • @Ammy 它释放分配给(内部)列表节点的内存。您可能会将其与 vector::clear 混淆,后者保留分配的数组以供重用。无论哪种方式,当容器被销毁时,它都会释放其所有内存。
  • malloc_trim(0) 去吧!我在这个问题上花了很多时间。非常感谢!
  • 关于操作系统内存:有没有办法告诉操作系统,程序需要 e。 G。 5GB,因为它实际上分别立即保留了这个数量,而不用 malloc 分配内存?
  • @Ammy 没有便携方式。
【解决方案2】:

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

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

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

【讨论】:

  • 我更正了我的问题。我只尝试了 free(),因为我已经没有可能的解决方案了。
猜你喜欢
  • 2023-03-18
  • 2017-01-12
  • 2012-02-11
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
相关资源
最近更新 更多