Я видел другие вопросы здесь, прежде чем относиться к этому, но моя проблема не вращается вокруг QVector, содержащего указатели.Ошибка утечки QVector?
У меня есть класс «Mesh», который содержит несколько QVector < T> для хранения вершин, индексов, нормалей и т. Д., Все они содержатся в качестве стандартных объектов.
В последнее время я заметил, что каждый раз, когда я удаляю сетку, объем памяти, используемой моим приложением , не уменьшается. Я отслеживаю использование памяти приложений с помощью диспетчера задач Windows и видел, что он достигает 1000 МБ, не отбрасывая один байт.
Я проверил с отладчиком, что Я достиг деконструктора моего класса меша, и мои векторы удаляются, но память все еще не освобождается.
Разрушитель в вопросе:
Mesh::~Mesh()
{
QVector<QVector3D> *vertices = this->vertices;
QVector<QVector3D> *normals = this->normals;
QVector<QVector3D> *tangents = this->tangents;
QVector<QVector2D> *textures = this->UVMap;
QVector<GLushort> *indices = this->indices;
vertices->clear();
vertices->squeeze();
delete vertices;
normals->clear();
normals->squeeze();
delete normals;
tangents->clear();
tangents->squeeze();
delete tangents;
textures->clear();
textures->squeeze();
delete textures;
indices->clear();
indices->squeeze();
delete indices;
}
Я использовал Визуальный детектор утечки, и это, кажется, в основном показывают утечки в библиотеке я использую (Qt), в дополнение к говорить мне, что некоторые из мои конструкторы протечка, как следующее:
Mesh::Mesh()
{
vertices = new QVector<QVector3D>();
indices = new QVector<GLushort>();
UVMap = new QVector<QVector2D>();
normals = new QVector<QVector3D>();
tangents = new QVector<QVector3D>();
}
Но я не вижу никаких проблем здесь, так как эти объекты не были инициализированы до этих вызовов.
Я действительно мало знаю о смарт-указателях, но я не решаюсь переключить все в своем приложении, чтобы использовать их, потому что я не знаю, смогут ли они даже реально или полностью заменить мое текущее использование без любые вопросы. Например, я могу передать некоторые указатели (например, целую сетку, например), в другой класс, но я не хочу, чтобы этот другой класс удалял эту сетку при ее собственном уничтожении.
Редактировать: Я подумал, что у меня есть деликатно написанный вопрос, но кажется, что люди предпочитают вместо этого использовать понижающие голоса. Я попробую другие программы для мониторинга моей проблемы.
Не уверен, что я вижу утечку памяти здесь, но вы считали, что просто выделили эти векторы в стеке вместо кучи? Если у меня нет проблемы с QVector, о котором я не знаю, этот код кажется излишне сложным. – MrEricSir
Я передаю ссылки примерно так, потому что я не хочу постоянно делать копии – Yattabyte
@ Yattabyte - вы можете легко передавать ссылки (или указатели) на вещи, которые являются частью объекта. –