C ++ удалить вектор, объекты, свободную память

Я полностью сбит с толку в отношении удаления вещей в C ++. Если я объявляю массив объектов и используюclear() функция. Могу ли я быть уверен, что память была освобождена?

Например

<code>tempObject obj1;
tempObject obj2;
vector<tempObject> tempVector;

tempVector.pushback(obj1);
tempVector.pushback(obj2);
</code>

Могу ли я безопасно позвонить, чтобы освободить всю память? Или мне нужно перебрать, чтобы удалить один за другим?

<code>tempVector.clear();
</code>

Если этот сценарий изменяется на указатель объектов, ответ будет таким же, как указано выше?

<code>vector<tempObject> *tempVector;
//push objects....
tempVector->clear();
</code>
 Marlon05 мая 2012 г., 21:01
Во втором случае ничто не отличается от первого случая, кроме того факта, что он указывает на вектор. Я думаю, что этот вопрос следует расширить, чтобы вы могли понять, как должно работать распределение / освобождение памяти, и, возможно, также указатели.
 Udayraj Deshmukh06 дек. 2017 г., 07:50
Этот говорит, что объявление его внутри стека функций автоматически вызывает деструктор при закрытии. / Stackoverflow.com вопросы / 3054567 / ...

Ответы на вопрос(4)

Решение Вопроса

и это уничтожит все объекты, но это не освободит память. Цикл по отдельным элементам также не поможет (какое действие вы бы даже предложили предпринять над объектами?) Что вы можете сделать, это:

vector<tempObject>().swap(tempVector);

Это создаст пустой вектор без выделенной памяти и поменяет его местами с tempVector, эффективно освобождая память.

C ++ 11 также имеет функциюshrink_to_fit, который вы можете вызвать после вызова clear (), и это теоретически уменьшит емкость до размера (который теперь равен 0). Однако это необязательный запрос, и ваша реализация может игнорировать его.

 Benjamin Lindley05 мая 2012 г., 21:10
@ delnan: Я бы не назвал это лучше, но она достигает цели освобождения памяти, тогда какresize(0) не. (это будет делать то же самое, что иclear())
 mister05 мая 2012 г., 21:03
Эй, спасибо за ответ. Вы не могли бы объяснить, что делает вышеперечисленное? после звонка мне нужно позвонить ясно?
 Benjamin Lindley05 мая 2012 г., 21:05
@ dupdupdup: Нет, вам не нужно звонить ясно. Объекты, которые были в tempVector, переносятся в пустой вектор. Затем пустой вектор, поскольку он является временным объектом без имени, уничтожается, а его содержимое, ранее принадлежавшее tempVector, уничтожается, а память освобождается.
 user39576005 мая 2012 г., 21:08
Я не эксперт по С ++, не могу объяснить, как это лучше, чемtempVector.resize(0) Я бы попробовал первым?
 Useless05 мая 2012 г., 21:10
std::vector::resize являетсяне требуетс чтобы освободить память, можно хранить ее на случай, если она понадобится позже.

ет его повторно в цикле или при каждом вызове функции, вероятно, вам не хватит памяти. Я предлагаю вам объявить это снаружи, передать их как указатели в ваших функциях и использовать:

my_arr.resize()

Таким образом, вы продолжаете использовать одну и ту же последовательность памяти для своих векторов вместо того, чтобы каждый раз запрашивать новые последовательности. Надеюсь, это помогло. Примечание: изменение размера до разных размеров может добавлять случайные значения. Передайте целое число, например 0, чтобы инициализировать их, если требуется.

vector::clear() не освобождает память, выделенную вектором для хранения объектов; он вызывает деструкторы для объектов, которые он содержит.

Например, если вектор использует массив в качестве резервного хранилища и в настоящее время содержит 10 элементов, тогда вызываетсяclear() вызовет деструктор каждого объекта в массиве, но резервный массив не будет освобожден, так что еще естьsizeof(T) * 10 байтов, выделенных для вектора (как минимум).size() будет 0, ноsize() возвращает количество элементов в векторе, не обязательно размер резервного хранилища.

Что касается вашего второго вопроса, то, что вы выделите с помощьюnew ты должен иметь дело сdelete. По этой причине вы обычно не поддерживаете указатель на вектор. Редко (если вообще) есть веская причина для этого, и вы предотвращаете очистку вектора, когда он выходит из области видимости. Тем не менее, вызовclear() все равно будет действовать одинаково независимо от того, как оно было выделе

объект жизни длительность хранения

Например

{
    vector<MyObject> v;
    // do some stuff, push some objects onto v
    v.clear(); // 1
    // maybe do some more stuff
} // 2

В1, ты чистv: это уничтожает все объекты, которые он хранил. Каждый получает свой деструктор, если вы его написали, и все, что принадлежит этомуMyObject теперь выпущен.Тем не мени, векторv имеет право хранить исходное хранилище на случай, если вы захотите его позже.

Если ты решишь вставить еще кое-что между1 а также2, это экономит время, так как может повторно использовать старую память.

В2, векторv выходит из области видимости: любые объекты, которые вы в него вставили, начиная с1 будет уничтожено (как если бы вы снова явно вызвали очистку), но теперь также освобождается основное хранилище v больше не буду его использовать).

Если я поменяю пример, тоv становится указателем, вам нужно явно удалить его, так как указатель выходит из области видимости при2 не делает это для тебя. Лучше использовать что-то вродеstd::unique_ptr в этом случае, но если нет, то иv утечка, место для хранения также будет утечка. Как и выше, вы должны убедиться, чv удален, и вызовclear недостаточно.

 user1310701 нояб. 2013 г., 04:35
Что вы имеете в виду под «Если вы решите нажать ... это экономит время, поскольку может повторно использовать старую память».? Почему старая память имеет значение, когда вы хотите добавить новые элементы?
 Useless01 нояб. 2013 г., 12:30
Вектор должен внутренне управлять хранилищем объектов, которые он хранит. Создание нового вектора требует выделения нового хранилища, но очистка и повторное использование существующего вектора позволяет (но не гарантирует) повторное использование его уже выделенного хранилища.

Ваш ответ на вопрос