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

Foi útil?

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

  1. 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)
  2. 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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top