Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
1

Освобождение вектора с указателями

24.01.2017, 21:23. Показов 1692. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим есть структура Node
и естьQVector<Node *> m_treeStates вектор указателей на эту структуру.

Если я выполняю процедуру QVector::clear(), в векторе не будет больше указателей, но память на которую они указывают останется занятой или нет?

C++ (Qt)
1
m_treeStates.clear();
Или нужно перед выполнением процедуры clear() пройтись по указателям и освободить их?

п.с. сорри за очередной вопрос =)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2017, 21:23
Ответы с готовыми решениями:

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

Объясните правила работы с delete с указателями и массивами (корректное освобождение выделенной памяти)
Указатель содержал ссылку на динамический массив. Массив удалил. Имеет ли смысл применять delete на...

Освобождение вектора
Доброго времени! Допустим в классе есть вектор с указателями Нужно ли в деструкторе класса...

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением:...

7
17 / 17 / 7
Регистрация: 08.10.2016
Сообщений: 48
24.01.2017, 21:41 2
Надо пройтись и удалить. Более того, начиная с 5.7 clear не освобождает даже память непосредственно занятую самими вектором. Надо использовать squeeze

Пруф из справки:
void QVector::clear()
Removes all the elements from the vector.
Note: Until Qt 5.6, this also released the memory used by the vector. From Qt 5.7, the capacity is preserved. To shed all capacity, swap with a default-constructed vector:

QVector<T> v ...;
QVector<T>().swap(v);
Q_ASSERT(v.capacity() == 0);

or call squeeze().
2
27 / 27 / 11
Регистрация: 15.10.2013
Сообщений: 880
24.01.2017, 21:46  [ТС] 3
Цитата Сообщение от Alex Smith Посмотреть сообщение
Надо пройтись и удалить. Более того, начиная с 5.7 clear не освобождает даже память непосредственно занятую самими вектором. Надо использовать squeeze
Серьезно?
Жесть какая-то...
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
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
    Qt 5.7 MSVC 64
    Tests QVector
*/
 
#include <QCoreApplication>
#include <QVector>
#include <QDebug>
 
struct Node{
    int a;
    int b;
    Node():a(10), b(100){}
};
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    const size_t SIZE = 5;
 
    QVector<Node*> v1;
    qDebug() << "\n QVector<Node*> v1 : " << v1;
 
    for(auto i(0); i < SIZE; i++)
        v1.append(new Node());
    qDebug() << "\n v1.append(new Node()); : " << v1;
 
    QVector<Node*> v2(v1);
    qDebug() << "\n QVector<Node*> v2(v1); : " << v2;
 
    Node * cur = v1.first();
    qDebug() << "\n Node * cur = v1.first(); : " << cur << ", cur->a : " << cur->a;
 
    v1.clear();
    qDebug() << "\n v1.clear() :" << v1 << ", v1.size() : " << v1.size() << ", v1.capacity() : " << v1.capacity();
    qDebug() << " Node * cur after "v1.clear();" : " << cur << ", cur->a : " << cur->a;
    qDebug() << " v2 after "v1.clear();" : " << v2;
 
    v1.squeeze();
    qDebug() << "\n v1.squeeze(); :" << v1 << ", v1.size() : " << v1.size() << ", v1.capacity() : " << v1.capacity();
 
    v2.squeeze();
    qDebug() << "\n v2.squeeze(); :" << v2 << ", v2.size() : " << v2.size() << ", v2.capacity() : " << v2.capacity();
    qDebug() << " Node * cur after "v2.squeeze();" : " << cur << ", cur->a : " << cur->a;
 
    delete cur;
    qDebug() << "\n delete cur; : " << cur << ", cur->a : " << cur->a;;
    qDebug() << " v2.first() after "delete cur;" : " << v2.first() << ", v2.first()->a : " << v2.first()->a;
 
 
    return a.exec();
}

Выходит QVector::squeez() удаляет зарезервированную память под QVector. Верно?=)
Миниатюры
Освобождение вектора с указателями  
0
17 / 17 / 7
Регистрация: 08.10.2016
Сообщений: 48
25.01.2017, 08:28 6
У меня сейчас нет возможности подробно вникнуть в код. Но скуиз особождает память, да. Об это там и написано.
1
1070 / 652 / 229
Регистрация: 14.01.2016
Сообщений: 2,031
Записей в блоге: 9
25.01.2017, 08:42 7
Лучший ответ Сообщение было отмечено andreyananas как решение

Решение

Цитата Сообщение от andreyananas Посмотреть сообщение
Или нужно перед выполнением процедуры clear() пройтись по указателям и освободить их?
Используй в таких случаях qDeleteAll.
1
2082 / 1573 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
25.01.2017, 09:07 8
Цитата Сообщение от andreyananas Посмотреть сообщение
Серьезно?
Жесть какая-то...
Ну почему жесть? Они же на роль тулса для эмбеддед претендуют. А в эмбеддед задачах не то что лишние а вообще реаллоки не приветствуются.
Цитата Сообщение от Alex Smith Посмотреть сообщение
Но это мои догадки. Я могу быть не прав.
При правильном подходе к архитектуре подобных иерархий объектов особенно касательно эмбеддеда динамически аллоцируемых буферов во временных данных стараются не держать. Т.е. все динамически аллоцируемые буфера живут полями долгоживущих объектов. Соответсвенно очень высока вероятность их повторного использования. А значит логично оптимизировать их именно так - очистка только элементы убирает а не саму память. А убить саму память обычно или отдельный метод и/или параметр/перегруженная версия метода очистки. Поскольку динамическое распределение/высвобождение как долгая сама по себе операция так и снижает надежность в следствие фрагментации кучи если его постоянно дергать.
1
25.01.2017, 09:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2017, 09:07
Помогаю со студенческими работами здесь

Даны 2 вектора определить у какого вектора наибольшее количество положительных элементов
Даны 2 вектора определить у какого вектора наибольшее количество положительных элементов. Программу...

Массив: Вычесть из каждого элемента действительного вектора C(c1,c2,..,c9) среднее арифметическое вектора.
Помогите решить, не знаю с чего начать: 1. Вычесть из каждого элемента действительного вектора...

Выделение столбцов из матрицы, сортировка полученного вектора, перестановка элементов вектора
Здравствуйте!Нужна помощь в пояснении. Дано задание в файле.По раздельности я примерно понимаю как...

Определить, находится ли компонента вектора С с наименьшим значением в первой половине вектора
Даны векторы A, B, C. Получить y=min A. Все компоненты вектора В, предшествующие первой по порядку...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru