-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
1 | |
Как правильно освобождать память от вектора?21.06.2018, 01:58. Показов 2058. Ответов 14
Метки нет Все метки)
(
0
|
|
21.06.2018, 01:58 | |
Ответы с готовыми решениями:
14
Как правильно освобождать память Как правильно освобождать память в динамических структурах Как и когда правильно освобождать динамически выделенную память? Как правильно освобождать мютексы |
Модератор
![]() ![]() |
|
21.06.2018, 06:23 | 3 |
SadiQ228, если речь про
std::vector , то никак. Он сам всё сделает. На то он и библиотечный вектор, что у него есть конструкторы и деструкторы. Вот деструкторы всю выделенную под элементы вектора память и освободят.Правило простое: выделял память руками - освобождай руками. Не выделял руками - не лезь руками, есть автоматические механизмы.
2
|
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
|
|
21.06.2018, 08:20 | 4 |
метод есть метод clear(); он просто очищает его
vector<int>s; s.clear();
0
|
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
|
|
21.06.2018, 08:33 | 5 |
А есть еще std::vector::shrink_to_fit, позволяющая уменьшить количество используемой памяти.
http://ru.cppreference.com/w/c... ink_to_fit Может ТС это как раз и нужно? Непонятно, что он имел ввиду.
2
|
Модератор
![]() ![]() |
|
21.06.2018, 12:45 | 6 |
Manowar, а вот тут вступает в силу принцип "Garbage In, Garbage Out" (в мягком литературном переводе - "Каков запрос, таков ответ").
Поскольку в стартовом сообщении вопрос был про освобождение памяти, про данный аспект работы вектора и говорим. Если/когда ТС уточнит, что он имел ввиду что-то другое, тогда и будем от новых вводных плясать. SadiQ228, отсюда мораль:
0
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
28.06.2018, 23:59 [ТС] | 7 |
ну я задавая этот вопрос рассуждал так; вектор это класс, у класса есть свой деструктор, надо ли мне заботиться об этом?
0
|
зомбяк
1582 / 1216 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
29.06.2018, 00:12 | 8 |
SadiQ228, у этого класса деструктор написан за тебя разработчиками библиотеки STL используемого компилятора, так что тебе в нём ничего реализовывать дополнительно не нужно. Ну а вызовы деструкторов (как кстати и конструкторов), если помнишь, производятся в большинстве случаев автоматически (за исключением случая placement new и выхода по исключениям)
0
|
-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
|
|
29.06.2018, 00:21 [ТС] | 9 |
ну все тогда я буду спокоен спасибо
0
|
Комп_Оратор)
![]() |
||||||
29.06.2018, 01:49 | 10 | |||||
Деструктор вектора запускает деструктора елементов и если это сырые указатели на выделенную память, например, то перед срабатыванием деструктора вектора нужно пройти по нему и освободить память вручную. Это сказано для примера, а не как призыв к действию. Есть
shared_ptr в конце концов.Каждый решает сам, что уместно, а что нет. Замечание Manowar, очень уместно на мой взгляд. Если сказать больше, то вызов reserve работает лишь на увиличинение размера, а при попытке уменьшения, ничего не делается. У Г.Сартра есть по этому поводу остроумное замечание:
shrink_to_fit в наилучшей реализации так и должна работать. Это красивый приём. Но грустный. Потому что, если Г.С. прав, то принудительно обрезать размер вектора без перевыделения и копирования нельзя. С точки зрения механизма управления памятью std::vector (в большинстве модных реализаций)) ), замечание вполне уместное (imho).
1
|
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
|
|
29.06.2018, 02:11 | 11 |
Такой вопрос может возникнуть если только std::vector хранит сырые указатели на объекты. Если это так, то то в цикле ручками освобождайте память, или используйте смарт указатели.
0
|
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
|
|
29.06.2018, 05:13 | 12 |
C++, вроде как, гарантирует вызов деструкторов для локальных объектов при раскрутке стека...
0
|
sourcerer
|
29.06.2018, 06:36
#13
|
Не по теме:
Знаю Герба Саттера (Herb Sutter), программиста, C++ эксперта. Г. Сартра не знаю. Добавлено через 3 минуты IGPIGP, я и не говорил иного. Самосвал был в огород SadiQ228'а, а не в огород Manowar'а. Возможно, Manowar угадал, и ТС имел ввиду именно это. А может и не угадал. Я лишь заметил, что гадать бесполезно, пока ТС не уточнит, что же он, собственно, имел ввиду.
0
|
Комп_Оратор)
![]() |
|
29.06.2018, 08:34 | 14 |
Читал.
Что касается Саттера, то ошибся, - каюсь. Вам как модератору и карты в руки, исправить. фраза после цитаты от Manowar и я не вижу То есть, я утверждал и утверждаю, что его ответ уместен. Вот и всё. Ваше замечание важно Благодарю. О вот это вопрос скорее не к совести а к логике. В смысле наличия. Потому что вы оставляете за собой право гадать: потому как знаете что уместно, а что, - нет. Отсюда и замечания в адрес других участников по поводу уместности. Что касается Герберта Саттера, то я его знаю ещё плохо (в отличие от вас). Спасибо, за едкое замечание и за то что не исправили, как модератор. Пусть каждый выглядит так, как выглядит.
0
|
Модератор
![]() ![]() |
|
29.06.2018, 09:40 | 15 |
IGPIGP, я исходил из своего понимания вопроса топик-стартера. Как мы видим из сообщений с #7 по #9 - я понял правильно. Право гадать есть у любого - я не пытался ни у кого таковое отнять. Попробовал угадать я, попробовал угадать Manowar. Когда до меня дошло, что мы просто гадаем, я высказал сомнение в целесообразности наших действий, и только.
Я не пытался никого задеть. Если Вам так показалось, значит я взял неверный тон (или недостаточно ясно выражал свои мысли и намерения), прошу прощения. Если желаете, чтобы я исправил ошибку в Вашем сообщении, я это сделаю. Как пожелаете.
0
|
29.06.2018, 09:40 | |
29.06.2018, 09:40 | |
Помогаю со студенческими работами здесь
15
Обязательно ли освобождать память?
Нужно ли освобождать память перед повторым выделением? Библиотека STL, нужно ли освобождать память после использования контейнеров? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |