C ++: автоматически ли вектор элементов-указателей освобождает динамическую память, указанную каждым указателем при уничтожении? - PullRequest
1 голос
/ 05 июля 2019

Заголовок не требует пояснений - выполняет ли стандартная векторная реализация освобождение динамической памяти, на которую указывают все указатели в векторе?

Ответы [ 4 ]

4 голосов
/ 05 июля 2019

Нет. Когда вы уничтожаете std::vector, он уничтожает все его элементы (вызывает их деструктор), а затем освобождает хранилище, используемое объектами. Но (необработанный) указатель не имеет деструктора - уничтожение делает , а не освобождение объекта, на который он указывает - он просто уничтожает хранилище, используемое для хранения самого указателя.

Если бы у вас было vector умных указателей (std::unique_ptr или std::shared_ptr), то это было бы другое дело. Эти классы do имеют деструкторы и do освобождают то, на что они указывают после уничтожения (unique_ptr всегда, shared_ptr, если это последний объект, указывающий на содержащийся объект, в противном случае он просто уменьшает значение его счетчик ссылок).

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

3 голосов
/ 05 июля 2019

Нет, это не так.Контейнеры не отвечают за управление памятью необработанных указателей.Было бы возможно автоматически освободить ваши элементы указателя, если бы они были умными указателями (RAII: https://fr.wikipedia.org/wiki/Resource_acquisition_is_initialization)

. Вы можете видеть указатель как простое целое число. Его значение представляет адрес памяти. Когда элемент векторного указателя имеет видудалено, байты, выделенные для хранения этого адреса, освобождаются. Таким образом, адрес памяти, на который указывает указатель, теряется (больше нет ссылки на него = утечка памяти).

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

3 голосов
/ 05 июля 2019

Нет, это не так.

Если вы хотите «самоуничтожаться» указатели, используйте умные указатели (std::unique_ptr или std::shared_ptr) или (в зависимости от того, для чего указатели используются) контейнер такойкак std::vector, std::array или std::string.

2 голосов
/ 05 июля 2019

Зависит от того, какие указатели содержит vector, для необработанных указателей, таких как

std::vector<Something*> 

нет, вы должны сделать уборку самостоятельно.

Если vector содержит умные указатели, с другой стороны, например, std::unique_ptr

std::vector<std::unique_ptr<Something>> 

тогда за тобой позаботятся.

Короче говоря: попробуйте использовать умные указатели.

...