Векторная память при закрытии программы c ++

0

У меня просто был быстрый вопрос об использовании векторов при программировании в c++. Если вы создаете вектор, вам нужно его очистить или удалить, прежде чем программа закроется или будет удалена вектор, и память освободится при закрытии программы?

благодаря

Стивен

  • 1
    зависит от того, как вы объявили / инициализировали экземпляр, а также от вашей ОС.
  • 0
    Замените vector на int или какой-нибудь другой встроенный тип. Это то же самое, нет никакой разницы.
Теги:
vector

6 ответов

0
Лучший ответ

Это зависит от того, как вы объявили свой вектор.

  1. Если вы используете RAII (ваш вектор является объектом стека, std::vector<...> myVec;)
  2. Или если вы создали его в куче (std::vector<...>* myVec = new std::vector<...>();)

В первом случае вам не придется ничего делать, потому что, как только вектор заканчивается из области действия (что всегда бывает, когда приложение завершается), его дескриптор будет вызван, и он очистит свои собеседники.

Во втором случае вам придется вызывать delete myVec; поэтому 1) вектор становится неинициализированным (так же, как в первом случае, деструктор называется и т.д.), и 2) память вашего вектора освобождается.

  • 0
    Вот что я подумал спасибо, я просто хотел проверить
0

Ваш вопрос затрагивает две разные вещи. ОС и срок жизни объекта в рамках программы

Часть ОС: Вообще говоря, в современных ОС вам не нужно ничего делать. Любая достойная современная операционная система дезактивирует память после завершения процесса. Даже динамически выделяется/запрашивается.

Это одна из причин, почему окна 95 были настолько ошибочными и неустойчивыми с течением времени. Он этого не делал. Поэтому, если приложение будет просачиваться из памяти (и приложения делали и делали это практически все время), это было бы постоянно забито.

c++: теперь, когда у вас есть современные контейнеры c++ и хорошо спроектированные и реализованные объекты, все они написали деструкторы. Поэтому они вежливы и приятны, и они освобождают собственную память. И они разрушаются в основном на двух условиях. Если вы не выделяете его динамически, например, через new компилятор знает, когда заканчивается жизнь объекта. Это выходит за рамки. И он вызывает деструктор автоматически. Если вы используете new вам нужно впоследствии delete.

Так что ответ. Объект может очистить после него сам не только когда приложение закрывается, но и когда объект умирает. Если вы, однако, просочитесь в память, вы все равно должны быть в безопасности, затем процесс завершается.

0

Когда вы "закрываете программу", операционная система несет ответственность за освобождение памяти, которую использовала программа. Независимо от того, как вы создали свой вектор, когда вы "закроете программу", вся память будет восстановлена. Тебе не о чем беспокоиться.

Однако в больших программах вы не должны полагаться на пользователя, "закрывающего программу", чтобы освободить используемую память. Если вы используете ключевое слово "новый", вы несете ответственность за вызов "удалить". Если вы объявили вектор без "нового", вам не нужно ничего делать, поскольку деструктор автоматически обработает освобождение памяти для вас.

0

Если вы не создали его с new (что, как правило, не следует), тогда нет необходимости ничего делать. Он будет автоматически уничтожен по истечении срока его службы, и деструктор автоматически освободит свою память.

Если вы создали его с new то для хорошего порядка вы должны убедиться, что вы удалите его до окончания программы. Если вы этого не сделаете, то большинство современных операционных систем все равно освободят память; но позволяя ему протекать, может затруднить отслеживание проблемных утечек и может вызвать проблемы с экзотическими операционными системами.

В любом случае нет необходимости его очищать; деструктор сделает это за вас.

0

Гораздо чаще встречается нечто подобное:

std::vector<MyType*> container;

Вместо того, чтобы что-то вроде этого:

std::vector<MyType> *container = new std::vector<MyType>;

На самом деле, я никогда в моих 15+ годах программирования не видел последнего. На мой взгляд, последнее, по моему мнению, победит цель контейнера STL. Я думаю, возможно, что кто-то все еще может программировать для Windows 95, но это кажется маловероятным. Наиболее распространенная проблема с любым контейнером STL - это когда у вас есть контейнер указателей. Поскольку контейнеры не могут быть гетерогенными, довольно часто можно увидеть или использовать контейнеры указателей на базу, класс интерфейса объектов. В этом случае вам нужно будет контактировать и удалять каждый объект до стирания объектов из вектора. Если вектор теряет область видимости, он не знает, как удалить объекты, на которые указывают. Он очистит память только для указателей, которые были добавлены.

Если вы выполните следующее, в функции или в объявлении класса, то у вас нет обязательств по очистке памяти. Реализация STL либо работает правильно, либо нет. В любом случае, нет ничего более того, что программист мог бы сделать, кроме как определить собственный собственный распределитель:

std::vector<MyType> container; // then add some stuff to it

Я не собираюсь вдаваться в форсирование или C++ 11, но FYI существуют специальные типы контейнеров в boost, которые предназначены для облегчения пользователя контейнеров указателей. Я не уверен, есть ли какие-либо новые функции C++ 11, которые предоставляют эту возможность. Лично я бы порекомендовал вам не беспокоиться о том, будут ли операционные системы делать правильные вещи, когда программа теряет память. Не просачивайте память. Если вы работаете со встроенной ОС, прочитайте документацию и убедитесь, что знаете, имеет ли ее реализация STL какие-либо ограничения.

0

Если вы просто объявите вектор, например.

std::vector<int> vec;

Он имеет автоматическую продолжительность хранения, и деструктор будет вызываться, когда он выходит за рамки.

Если вы использовали new, вы должны использовать delete.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню