memória dinâmica em QList
-
19-09-2019 - |
Pergunta
Eu não tenho muita experiência com QT e este problema saiu hoje.
QList<int> memList;
const int large = 100000;
getchar();
for (int i=0; i<large; i++)
{
memList.append(i);
}
cout << memList.size() << endl;
getchar();
for (int i=0; i<large; i++)
{
memList.removeLast();
}
cout << memList.size() << endl;
getchar();
Depois de primeiro ciclo quando eu verificar o uso de memória sobe à medida que novos elementos são acrescentados ao memList
mas depois removê-los dentro segundo loop as estadias de uso de memória no mesmo nível. Pensei que QList
foi dinâmica e que iria liberar memória quando o elemento é removido. Então, ou eu estou faltando alguma coisa (muito provável) ou não é estrutura dinâmica. Você tem alguma idéia de como fazê-lo funcionar?
Saudações
Solução
A partir da docs parece que este é o comportamento esperado:
Note que a matriz interna só nunca fica maior ao longo da vida da lista. Ele nunca diminui. A matriz interna é desalocada pelo destruidor e pelo operador de atribuição, quando um lista é atribuído a outro.
Se você quiser de-alocar a memória que você tem um par de opções
- Verifique se o destruidor é chamado (com exclusão {supondo que você new'd a lista em primeiro lugar}, ou permitindo que o objeto QList para ir fora do escopo)
- Atribuir uma lista vazia à sua lista grande (acho que isso vai funcionar)
Outras dicas
Lembro-me de ler sobre isto:
http: // cplusplus- soup.com/2010/01/05/freedelete-not-returning-memory-to-os/
Parece que pode ser a ver com a alocação de memória / comportamento de exclusão, mas eu não estou 100% certo sobre isso.
QList é parcialmente entre QVector (semelhante ao std :: vector) e < a href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" rel = "nofollow noreferrer"> QLinkedList (similar lista para std ::). QList contém uma matriz de ponteiros para os objetos em si.
Isto significa esquema que triagem / reordenar a lista é rápido, mas o ponteiro-store cresce continuamente à medida que os itens são adicionados (semelhante a um vector). Assim, a remoção de itens da lista libera a memória usada pelos itens, mas não o ponteiro na matriz.
Para memória recuperação, você precisa construir uma nova lista. QVector tem aperto (), mas que não parece presente em QList.
QList é recomendado para listas de <1000 objetos. Se você precisa lidar com listas muito grandes e precisam da memória a ser recuperada como objetos são excluídos, você deve considerar o uso QLinkedList.
Tente este código para a memória livre de QList
while( ! memList.isEmpty() )
delete memList.takeFirst();