я имею QVector<QSharedPointer<SomeData> > DataVec
как поле одного класса в большом объектно-ориентированном проекте. Программа получает переполнение памяти во время циклического выполнения части кода, где выделяется большая память, контролируемая QSharedPointers.
Во время цикла выполнения программы DataVec
заполнен
DataVec.push_back(QSharedPointer<SomeData>(new SomeData()));
Будет QSharedPointer
быть удаленным (освобожденным) после вызова DataVec.pop.back()
или же DataVec.clear()
?
Я думаю нет. Мы должны вызвать явно деструктор для QSharedPointer
(Я не вижу также метод, подобный boost :: shared_ptr :: reset () в Qt). чем, SomeData
деструктор по умолчанию (SomeData имеет только стандартные контейнеры Qt в качестве полей) будет вызван, если у нас больше нет QSharedPointers
это указывает на SomeData
экземпляр касается, и память будет освобождена. Теперь я только делаю pop_back()
кажется, я просто теряю указатели на невыпущенные данные (после выполнения valgrind указывает, что я определенно потерял блоки, и я предполагаю, что они происходят отсюда).
Итак, наконец, я прав? А также как я могу удалить QSharedPointer
из контейнера правильный путь?
РЕДАКТИРОВАТЬ 1:
Такой метод, как boost :: shared_ptr :: reset () в Qt: QSharedPointer::clear()
,
QVector вызовет деструктор своего элемента, когда элемент будет удален из него, используя pop_back
, clear
или любым другим способом.
Если в векторе есть общий указатель на объект и в нем больше нет общих указателей на этот объект, удаление общего указателя из вектора обязательно приведет к удалению объекта.
Если есть общие указатели на этот объект где-то еще, объект не будет удален, пока не будут удалены все ссылки.
Других решений пока нет …