Значения замены 2D std::vector - нужно удалить, чтобы избежать утечек памяти?

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

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

  • Нужно ли удалять старый вектор перед его переназначением (в строке 5), поскольку в std::vector<int> хранится копия 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
}

Я хочу избежать утечек памяти.

Так как вы не звоните new, вам не нужно delete. Но вам, вероятно, следует сделать line ссылку, чтобы избежать ненужных копий.

HolyBlackCat 18.03.2019 11:28

Предположим, что проще всего было бы просто иметь std::fill(it->begin(), it->end(), 0);...

Aconcagua 18.03.2019 11:41

Зависит от того, что вы делаете со своими векторами, но, возможно, отображение двух измерений в одномерном массиве более эффективно (auto getValue(r, c) { return v[r*columns + c]; }). Сохранение синтаксиса v[r][c] все еще возможно, но требует дополнительной работы (включая промежуточный класс).

Aconcagua 18.03.2019 11:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Мне было интересно, поскольку я push_back вектор int, как он хранится? Я имею в виду, что исходный вектор хранится в стеке, поскольку он объявлен внутри метода класса, верно? Но тогда std::vector имеет дело с выделением памяти в куче? он собирает мусор?

user7082181 18.03.2019 12:27

Смотрите редактирование моего ответа (было слишком долго отвечать в качестве комментария).

AlbertM 18.03.2019 13:38

Другие вопросы по теме