-4 / 24 / 7
Регистрация: 16.12.2016
Сообщений: 716
1

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

21.06.2018, 01:58. Показов 2058. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ПОжалуйста если можно пример для одномерного и двумерного.
циклом или метод есть какой то?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2018, 01:58
Ответы с готовыми решениями:

Как правильно освобождать память
Подскажите пожалуйста ,где память чистить в таком случае?Или как это правильно сделать. char...

Как правильно освобождать память в динамических структурах
Использую деструктор для освобождения памяти от указателя на начало списка. struct Node { int...

Как и когда правильно освобождать динамически выделенную память?
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно...

Как правильно освобождать мютексы
Здравствуйте, у меня вопрос, есть разница в том как освобождать мютексы?? пример захватываем...

14
Неэпический
17850 / 10618 / 2049
Регистрация: 27.09.2012
Сообщений: 26,689
Записей в блоге: 1
21.06.2018, 05:39 2
Чего освобождать?
0
Модератор
Эксперт CЭксперт С++
5279 / 2366 / 342
Регистрация: 20.02.2013
Сообщений: 5,766
Записей в блоге: 20
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
Цитата Сообщение от Antikl Посмотреть сообщение
он просто очищает его
А есть еще std::vector::shrink_to_fit, позволяющая уменьшить количество используемой памяти.
http://ru.cppreference.com/w/c... ink_to_fit
Может ТС это как раз и нужно? Непонятно, что он имел ввиду.
2
Модератор
Эксперт CЭксперт С++
5279 / 2366 / 342
Регистрация: 20.02.2013
Сообщений: 5,766
Записей в блоге: 20
21.06.2018, 12:45 6
Цитата Сообщение от Manowar Посмотреть сообщение
Может ТС это как раз и нужно? Непонятно, что он имел ввиду.
Manowar, а вот тут вступает в силу принцип "Garbage In, Garbage Out" (в мягком литературном переводе - "Каков запрос, таков ответ").
Поскольку в стартовом сообщении вопрос был про освобождение памяти, про данный аспект работы вектора и говорим. Если/когда ТС уточнит, что он имел ввиду что-то другое, тогда и будем от новых вводных плясать.

SadiQ228, отсюда мораль:
  • учимся формулировать свои вопросы. Данный скилл в современном мире из разряда must have. Без него ни поисковой запрос нормальный не сформулируешь, ни вопрос на форуме, не говоря уже о техзадании.
  • учим терминологию. Среда профессиональная, чтобы тебя понимали, надо правильно использовать термины.
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
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
29.06.2018, 01:49 10
Цитата Сообщение от SadiQ228 Посмотреть сообщение
ну все тогда я буду спокоен спасибо
Деструктор вектора запускает деструктора елементов и если это сырые указатели на выделенную память, например, то перед срабатыванием деструктора вектора нужно пройти по нему и освободить память вручную. Это сказано для примера, а не как призыв к действию. Есть shared_ptr в конце концов.
Цитата Сообщение от gru74ik Посмотреть сообщение
А вот тут вступает в силу принцип "Garbage In, Garbage Out"
Каждый решает сам, что уместно, а что нет. Замечание Manowar, очень уместно на мой взгляд. Если сказать больше, то вызов reserve работает лишь на увиличинение размера, а при попытке уменьшения, ничего не делается. У Г.Сартра есть по этому поводу остроумное замечание:
C++
1
2
3
vector<int> c(1000);
c.erase(c.begin()+10, c.end());
vector<int>(c).swap(c);
И он утверждает, что 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
Цитата Сообщение от TRam_ Посмотреть сообщение
выхода по исключениям
C++, вроде как, гарантирует вызов деструкторов для локальных объектов при раскрутке стека...
0
sourcerer
29.06.2018, 06:36
  #13

Не по теме:


Цитата Сообщение от IGPIGP Посмотреть сообщение
Г.Сартра
Знаю Жана-Поля Сартра (Jean-Paul Sartre), философа.
Знаю Герба Саттера (Herb Sutter), программиста, C++ эксперта.
Г. Сартра не знаю.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Замечание Manowar, очень уместно на мой взгляд.
IGPIGP, я и не говорил иного. Самосвал был в огород SadiQ228'а, а не в огород Manowar'а. Возможно, Manowar угадал, и ТС имел ввиду именно это. А может и не угадал. Я лишь заметил, что гадать бесполезно, пока ТС не уточнит, что же он, собственно, имел ввиду.

0
Комп_Оратор)
Эксперт по математике/физике
8935 / 4690 / 628
Регистрация: 04.12.2011
Сообщений: 13,960
Записей в блоге: 16
29.06.2018, 08:34 14
Цитата Сообщение от gru74ik Посмотреть сообщение
Знаю Жана-Поля Сартра
Читал.
Что касается Саттера, то ошибся, - каюсь. Вам как модератору и карты в руки, исправить.
Цитата Сообщение от gru74ik Посмотреть сообщение
А вот тут вступает в силу принцип "Garbage In, Garbage Out"
фраза после цитаты от Manowar и я не вижу
Цитата Сообщение от gru74ik Посмотреть сообщение
не в огород Manowar'а
То есть, я утверждал и утверждаю, что его ответ уместен. Вот и всё. Ваше замечание важно
Цитата Сообщение от gru74ik Посмотреть сообщение
Знаю Герба Саттера
Благодарю.
О вот это
Цитата Сообщение от gru74ik Посмотреть сообщение
Я лишь заметил, что гадать бесполезно, пока ТС не уточнит
вопрос скорее не к совести а к логике. В смысле наличия. Потому что вы оставляете за собой право гадать:
Цитата Сообщение от gru74ik Посмотреть сообщение
Вот деструкторы всю выделенную под элементы вектора память и освободят.
Правило простое: выделял память руками - освобождай руками. Не выделял руками - не лезь руками, есть автоматические механизмы.
потому как знаете что уместно, а что, - нет. Отсюда и замечания в адрес других участников по поводу уместности.
Что касается Герберта Саттера, то я его знаю ещё плохо (в отличие от вас). Спасибо, за едкое замечание и за то что не исправили, как модератор. Пусть каждый выглядит так, как выглядит.
0
Модератор
Эксперт CЭксперт С++
5279 / 2366 / 342
Регистрация: 20.02.2013
Сообщений: 5,766
Записей в блоге: 20
29.06.2018, 09:40 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
вы оставляете за собой право гадать
IGPIGP, я исходил из своего понимания вопроса топик-стартера. Как мы видим из сообщений с #7 по #9 - я понял правильно. Право гадать есть у любого - я не пытался ни у кого таковое отнять. Попробовал угадать я, попробовал угадать Manowar. Когда до меня дошло, что мы просто гадаем, я высказал сомнение в целесообразности наших действий, и только.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Спасибо, за едкое замечание
Я не пытался никого задеть. Если Вам так показалось, значит я взял неверный тон (или недостаточно ясно выражал свои мысли и намерения), прошу прощения.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Спасибо, за то что не исправили
Если желаете, чтобы я исправил ошибку в Вашем сообщении, я это сделаю.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Пусть каждый выглядит так, как выглядит.
Как пожелаете.
0
29.06.2018, 09:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2018, 09:40
Помогаю со студенческими работами здесь

Обязательно ли освобождать память?
Обязательно ли освобождать память, если та область которая выделялась не использовалась в процессе...

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

Нужно ли освобождать память перед повторым выделением?
к примеру мы имеем: char *itsString = new char; delete itsString; char *itsString = new char;...

Библиотека STL, нужно ли освобождать память после использования контейнеров?
Когда я использую vector, list, и т.д. мне нужно потом освобождать память или оно само очищается?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru