Я создаю вектор целых в куче следующим образом:
std::vector<int> vec = *new std::vector<int>();
затем я заканчиваю свою программу и мне нужно освободить память, но используя vec.clear()
не освобождает память
Как мне сделать это правильно?
Спасибо и всего наилучшего
-Mitchell
Как мне сделать это правильно?
Заменить это:
std::vector<int> vec = *new std::vector<int>();
С этим:
std::vector<int> vec;
Задача решена.
В отличие от других языков, с которыми вы, возможно, сталкивались, new
лучше избегать в большинстве ситуаций. Он динамически распределяет объекты, как в других языках. Но в отличие от других языков, C ++ не имеет сборщика мусора, поэтому вам нужно вручную уничтожать объекты, которые вы динамически выделяете. Однако, как вы написали свой код, вы сделали это невозможным.
Вы динамически распределяете объект с помощью new, который возвращает указатель на объект. Затем вы разыменовываете этот указатель (через *) и копируете объект в vec
, vec
уничтожается должным образом, а динамически размещенный объект, с которого он был скопирован, — нет. И поскольку вы не сохранили этот указатель, у вас не останется ни способа получить доступ к этому объекту, ни способа избавиться от него. Чтобы уничтожить этот объект, вам нужно было бы захватить указатель, например так:
std::vector<int>* vec_pointer = new std::vector<int>();
Затем позже вы можете вызвать delete для указателя, который уничтожает объект и освобождает память:
delete vec_pointer;
К счастью, динамическое распределение не является необходимостью, как это часто бывает в других языках. Объявление объекта создает его, и он уничтожается, когда выходит из области видимости. Таким образом, простая строка кода, которую я показал вам, является достаточной, без необходимости удаления оператора.
В качестве примечания, если вы по какой-то причине определили, что вы должны иметь динамическое распределение. Используйте умный указатель (Google, что).
У вашей программы утечка памяти.
std::vector<int> vec
объявляет вектор в стеке Вы создаете второй (пустой) вектор в куче и используете его для создания копии в стеке. Поскольку он пуст, это фактически ничего не делает.
Но вы потеряли указатель на вектор, который был создан в куче (потому что вы никогда не сохраняли его). Таким образом, вы не можете удалить его, и эта память не может быть восстановлена. Вектор в стеке, однако, хорошо очищается после себя.
То, что вы, вероятно, хотите, просто:
std::vector<int> vec; // Vector on stack, no manual memory management required
Если вы действительно хотите использовать кучу по какой-то причине (стек быстрее, а сам векторный объект имеет небольшой фиксированный размер независимо от того, сколько элементов вы в него поместите, так что вам не придется беспокоиться о переполнении стека) , ты можешь сделать:
// Declare pointer to vector, and initialize it with a new vector on the heap
std::vector<int>* vec = new std::vector<int>();
Или даже (в C ++ 11):
auto vec = new std::vector<int>();
Затем, когда вы закончите с этим:
delete vec;