std::vector
управляет собственной памятью. Это означает, что когда вызывается деструктор вектора, память, содержащаяся в векторе, освобождается. std::vector
также вызывает деструктор объекта при его удалении (через erase
, pop_back
, clear
или деструктор вектора).
Когда вы делаете это:
Radio newradio(radioNum);
m_radios.push_back(newradio);
Вы добавляете копию newradio
(созданную с помощью конструктора копирования Radio
) к вектору. newradio
будет уничтожено, когда выйдет из области видимости, и копия будет уничтожена, когда будет удалена из вектора (как и для любого объекта).
Это важный момент: std::vector
хранит только копий объекта, что означает, что у объекта должен быть значимый конструктор копирования (и оператор присваивания, но это другая проблема). Если у вас есть вектор указателей, то будет скопирован сам указатель, а не то, на что он указывает. Обратите внимание, что это поведение одинаково для каждого стандартного контейнера (например, std::list
или std::set
).
Как правило, если вы не используете указатели, вам не нужно беспокоиться об освобождении памяти самостоятельно.
В C ++ 11 большинство стандартных контейнеров (включая vector
) имеют метод emplace_back
, который создает объект вместо в конце контейнера. Он принимает набор параметров и вызывает конструктор, который лучше всего соответствует этим параметрам (или завершается неудачей, если такого конструктора не существует), используя указанный конструктор для создания объекта без какой-либо копии в конце контейнера. Таким образом, приведенный выше код можно переписать так:
m_radios.emplace_back(radioNum); // construct a Radio in place,
// passing radioNum as the constructor argument
Также в C ++ 11 контейнеры обычно знают о перемещении , поэтому им больше не требуется копирование объектов: если они подвижные , тогда контейнер будет перемещать свое содержимое по мере необходимости (например, во время перераспределения). Копируемые типы все еще требуются, если вы хотите скопировать вектор.