Вектор целых на кучу и освобождение памяти

Я создаю вектор целых в куче следующим образом:

std::vector<int> vec = *new std::vector<int>();

затем я заканчиваю свою программу и мне нужно освободить память, но используя vec.clear() не освобождает память

Как мне сделать это правильно?

Спасибо и всего наилучшего
-Mitchell

0

Решение

Как мне сделать это правильно?

Заменить это:

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, что).

4

Другие решения

У вашей программы утечка памяти.

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;
2

По вопросам рекламы [email protected]