m_gates[index].release(); m_gates.shrink_to_fit();
Исходя из вашего комментария, вам нужно просто стереть этот единственный элемент с вашего вектора прямо там и сейчас. Замените оба этих утверждения на:
m_gates.erase(m_gates.begin() + index);
Или более универсальную c версию, если возможна замена контейнеров в будущем:
using std::begin;
m_gates.erase(std::next(begin(m_gates), index));
erase
поддерживает итераторы, а не индексы, так что там есть преобразование. Это удалит указатель из вектора при вызове его деструктора, что заставит unique_ptr
правильно очистить его память.
Теперь стирание элементов по одному может потенциально быть проблемой производительности. Если это в конечном итоге вызывает озабоченность, вы можете сделать то, что вы поняли в вопросе, и обнулить их, а затем удалить их все в одном go позже:
m_gates[index].reset();
// At some point in the program's future:
std::erase(m_gates, nullptr);
Что у вас щас очень вероятно будет утечка памяти. release
освобождает владелец управляемой памяти, что означает, что теперь вы несете ответственность за ее очистку, а это не то, что вы искали. И erase
, и reset
(или, что эквивалентно, = {}
или = nullptr
) фактически вызовут деструктор unique_ptr
, пока он все еще владеет, и правильно очистят память. shrink_to_fit
относится к векторной емкости, а не к размеру и не имеет отношения.