【问题标题】:How to free memory for vector of vectors (C++)如何为向量向量释放内存(C++)
【发布时间】:2020-09-14 21:15:24
【问题描述】:

我有一个vector<vector<double>> elem,我想在我的程序中多次释放它的内存。

我尝试过使用

vector<vector<double>>().swap(elem);

甚至是for cicle

for(int i=0; i<elem.size();i++)
    vector<double>().swap(elem[i]);
vector<vector<double>>().swap(elem);
elem.resize(dim, vector<double>(0));

(我希望第一个维度是某个数字dim

但是当我打电话时

cout<<elem[0].size(); 

在我的程序中,即使我刚刚使用了上述方法,输出也不断增长。向量的“主要”大小不存在此问题。

cout<<elem.size();

总是输出dim

编辑:我知道 clear() 但我想释放向量,shrink_to_fit() 也不起作用。这也是在主函数之外的一个函数中实现的,如下所示:

void arrayReset(vector<vector<double>> elem) {
        for(int i=0; i<elem.size();i++)
        vector<double>().swap(elem[i]);
    vector<vector<double>>().swap(elem);
    elem.resize(dim, vector<double>(0));
}

【问题讨论】:

  • 您是否要清除或替换这些向量?通常,如果您正确操作它们,则不需要释放或解除分配。这一切都是自动完成的。也许你只是想要clear()
  • 我想多次释放它的内存 那是非常低效的。您应该分配一次,然后根据需要重新使用存储。 vector 有一个 clear 成员函数,可以帮助你。

标签: c++ vector swap


【解决方案1】:

您的新函数void arrayReset(vector&lt;vector&lt;double&gt;&gt; elem) { 获取您的向量的COPY 并[可能] 清理它;你永远不会在调用函数中看到它。

如果你通过引用传递你的向量,你将操纵原始向量。

【讨论】:

  • 另一个为什么要求人们发布完整的、最小的程序来重现错误的另一个例子...... :-(
【解决方案2】:

如何为向量释放内存

无论元素类型如何,所有向量的方式都是相同的。

第 1 步:删除向量的元素。最简单的方法是clear 成员函数。在这一步之后,size 成员函数将返回 0。

第二步:调用shrink_to_fit成员函数,请求释放内存。在这一步之后,capacity 可能会返回 0。

从技术上讲,shrink_to_fit 是语言实现不需要遵守的请求。释放内存的唯一保证方法是销毁向量。示例:

{
    std::vector<std::vector<double> vector;
    // use vector here
}
// memory has been deallocated

我想在我的程序中多次释放它的内存。

请注意,这通常比不多次释放要慢。我建议确保你想要一些真正有用的东西。

【讨论】:

  • 我也尝试了 clear()/shrink_to_fit() 方式,但似乎我无法清除该向量。向量在主函数之外的一个单独的 void 函数中被清空。
  • @userakai clear 将从向量中删除所有元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2016-11-17
  • 2020-10-14
  • 2014-06-24
相关资源
最近更新 更多