2D std :: vector заменяет значения - нужно удалить, чтобы избежать утечек памяти? - PullRequest
3 голосов
/ 18 марта 2019

У меня есть двумерный вектор, и я хочу, чтобы все значения int были заменены нулями .

Хотя этот код, кажется, работает, мне было интересно:

  • Нужно ли удалять старый вектор перед его переназначением (в строке 5), поскольку в line?

  • Это лучший способ заменить значения (используя итераторы)?

Код:

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 Ответ

4 голосов
/ 18 марта 2019

Вам ничего не нужно delete в вашем коде, так как вы ничего не создали с помощью new.

Если вы тоже хотите сделать все это в одной строке, вы можете использовать std::for_each и std::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 выделяет эти элементы в динамической памяти, иначе говоря, вам не нужно беспокоиться об освобождении или удалении этой памяти, поскольку она обрабатывается внутренними элементами вектора.Это означает, что память удаляется самое позднее, если вызывается деструктор вектора (например, потому что он выходит из области видимости) или, возможно, раньше, если вы изменяете размер вектора.

...