Как я могу удалить QSharedPointer из контейнера правильным способом

я имею 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(),

1

Решение

QVector вызовет деструктор своего элемента, когда элемент будет удален из него, используя pop_back, clear или любым другим способом.

Если в векторе есть общий указатель на объект и в нем больше нет общих указателей на этот объект, удаление общего указателя из вектора обязательно приведет к удалению объекта.

Если есть общие указатели на этот объект где-то еще, объект не будет удален, пока не будут удалены все ссылки.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]