2015-06-29 3 views
-1

Я видел другие вопросы здесь, прежде чем относиться к этому, но моя проблема не вращается вокруг 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>(); 
} 

Но я не вижу никаких проблем здесь, так как эти объекты не были инициализированы до этих вызовов.

Я действительно мало знаю о смарт-указателях, но я не решаюсь переключить все в своем приложении, чтобы использовать их, потому что я не знаю, смогут ли они даже реально или полностью заменить мое текущее использование без любые вопросы. Например, я могу передать некоторые указатели (например, целую сетку, например), в другой класс, но я не хочу, чтобы этот другой класс удалял эту сетку при ее собственном уничтожении.

Редактировать: Я подумал, что у меня есть деликатно написанный вопрос, но кажется, что люди предпочитают вместо этого использовать понижающие голоса. Я попробую другие программы для мониторинга моей проблемы.

+3

Не уверен, что я вижу утечку памяти здесь, но вы считали, что просто выделили эти векторы в стеке вместо кучи? Если у меня нет проблемы с QVector, о котором я не знаю, этот код кажется излишне сложным. – MrEricSir

+0

Я передаю ссылки примерно так, потому что я не хочу постоянно делать копии – Yattabyte

+0

@ Yattabyte - вы можете легко передавать ссылки (или указатели) на вещи, которые являются частью объекта. –

ответ

1

Нет утечки памяти. Ниже приводится вывод, выданный valgrind

==7881== Memcheck, a memory error detector 
==7881== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==7881== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info 
==7881== Command: ./abstractitemmodel 
==7881== 
==7881== 
==7881== HEAP SUMMARY: 
==7881==  in use at exit: 0 bytes in 0 blocks 
==7881== total heap usage: 8 allocs, 8 frees, 168 bytes allocated 
==7881== 
==7881== All heap blocks were freed -- no leaks are possible 
==7881== 
==7881== For counts of detected and suppressed errors, rerun with: -v 
==7881== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Если вы действительно хотите, чтобы проверить наличие утечки памяти, вы должны использовать специализированное ПО, такие как valgrind (для Linux). valgrind - отличный инструмент для этой цели.

+0

Я не использую Linux, поэтому я не могу использовать valgrind. Это действительно не имеет смысла, потому что я наблюдаю, как использование памяти остается неизменным, несмотря на вызов clear(), squeeze() и delete для каждого вектора. – Yattabyte

+0

Проверьте это [ссылка] (http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows). Программисты не проверяют диспетчер задач на утечку памяти. Они используют программное обеспечение, созданное специально для этой цели. Я предполагаю, что вы новичок в программировании.В приведенном выше коде отсутствует утечка памяти. –

+0

Я программу для удовольствия, так как мой местный университет не предлагает много, и на протяжении этих лекций не один раз предлагалась лучшая альтернатива. Я много лет тренируюсь по личным проектам, но раньше у меня не было утечки этого масштаба. Избегайте комментариев и предположений. – Yattabyte