27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
|
||||||
1 | ||||||
Освобождение вектора с указателями24.01.2017, 21:23. Показов 1692. Ответов 7
Метки нет (Все метки)
Допустим есть структура Node
и естьQVector<Node *> m_treeStates вектор указателей на эту структуру. Если я выполняю процедуру QVector::clear(), в векторе не будет больше указателей, но память на которую они указывают останется занятой или нет?
п.с. сорри за очередной вопрос =)
0
|
24.01.2017, 21:23 | |
Ответы с готовыми решениями:
7
Освобождение памяти и работа с 2 указателями на массив Объясните правила работы с delete с указателями и массивами (корректное освобождение выделенной памяти) Освобождение вектора Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора |
17 / 17 / 7
Регистрация: 08.10.2016
Сообщений: 48
|
|
24.01.2017, 21:41 | 2 |
Надо пройтись и удалить. Более того, начиная с 5.7 clear не освобождает даже память непосредственно занятую самими вектором. Надо использовать squeeze
Пруф из справки:
2
|
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
|
|
24.01.2017, 21:46 [ТС] | 3 |
0
|
17 / 17 / 7
Регистрация: 08.10.2016
Сообщений: 48
|
|
24.01.2017, 21:53 | 4 |
Вы про то, что надо пройтись или про то, что не освобождает свою память?
В первом случае в деструкторе это можно быстренько сделать. А если про второе то, сдается мне, сделано это для следующих целей: clear не удаляет сам вектор, только его элементы. Значит сам вектор вам может еще понадобиться, а значит и память выделенная для его элементов тоже. Полагаю если вы снова будете добавлять в такой вектор элементы, то размещаться они будут в той же памяти - сколько влезет. Только после начнется выделение новой. Чуть-чуть сэкономили времени на выделении памяти. Но это мои догадки. Я могу быть не прав.
0
|
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
|
||||||
25.01.2017, 07:00 [ТС] | 5 | |||||
Выходит QVector::squeez() удаляет зарезервированную память под QVector. Верно?=)
0
|
17 / 17 / 7
Регистрация: 08.10.2016
Сообщений: 48
|
|
25.01.2017, 08:28 | 6 |
У меня сейчас нет возможности подробно вникнуть в код. Но скуиз особождает память, да. Об это там и написано.
1
|
25.01.2017, 08:42 | 7 |
Сообщение было отмечено andreyananas как решение
Решение
Используй в таких случаях qDeleteAll.
1
|
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
25.01.2017, 09:07 | 8 |
Ну почему жесть? Они же на роль тулса для эмбеддед претендуют. А в эмбеддед задачах не то что лишние а вообще реаллоки не приветствуются.
При правильном подходе к архитектуре подобных иерархий объектов особенно касательно эмбеддеда динамически аллоцируемых буферов во временных данных стараются не держать. Т.е. все динамически аллоцируемые буфера живут полями долгоживущих объектов. Соответсвенно очень высока вероятность их повторного использования. А значит логично оптимизировать их именно так - очистка только элементы убирает а не саму память. А убить саму память обычно или отдельный метод и/или параметр/перегруженная версия метода очистки. Поскольку динамическое распределение/высвобождение как долгая сама по себе операция так и снижает надежность в следствие фрагментации кучи если его постоянно дергать.
1
|
25.01.2017, 09:07 | |
25.01.2017, 09:07 | |
Помогаю со студенческими работами здесь
8
Даны 2 вектора определить у какого вектора наибольшее количество положительных элементов Массив: Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое вектора. Выделение столбцов из матрицы, сортировка полученного вектора, перестановка элементов вектора Определить, находится ли компонента вектора С с наименьшим значением в первой половине вектора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |