2D std :: vector替换值-是否需要删除以避免内存泄漏?

时间:2019-03-18 10:26:48

标签: c++ stdvector

我有一个2D向量,我希望所有的int值都用 zeros 代替。

尽管此代码似乎可以工作,但我想知道:

  • 由于在std::vector<int>中存储了line的副本,我是否需要在重新分配旧向量之前删除它(在第5行)?

  • 这是替换值(使用迭代器)的最佳方法吗?

代码:

for (std::vector< std::vector<int> >::iterator it = data.begin(); it != data.end(); ++it)
{
  std::vector<int> line = *it;
  std::fill(line.begin(), line.end(), 0);
  *it = line; // line 5
}

我想避免内存泄漏。

1 个答案:

答案 0 :(得分:4)

您不需要delete代码中的任何内容,因为您无需使用new创建任何内容。

如果您也想单行执行所有这些操作,则可以使用std::for_eachstd::fill

#include <algorithm>
#include <vector>
std::vector<std::vector<int>> a;

// set every element in two dimensional vector to 5
std::for_each(a.begin(), a.end(), [](std::vector<int> &x){std::fill(x.begin(), x.end(), 5);});

与您的评论有关的附录 是的,您的原始向量存储在堆栈中。由于您没有传递自定义分配器,因此向量将使用std::allocator来分配其元素(在您的情况下是int的向量)。 std::allocator在动态内存(也就是堆)中分配这些元素,但是您不必担心释放或删除此内存,因为它是由向量内部处理的。这意味着,如果调用了向量的析构函数(例如,因为它超出范围),则最晚在内存被删除,或者如果更改向量的大小,则可能会更早地删除内存。