Domanda

Non ho molta esperienza con QT e questo problema è venuto fuori oggi.

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();

Dopo il primo ciclo quando posso controllare l'utilizzo della memoria risale come nuovi elementi vengono aggiunte al memList ma dopo averli rimossi all'interno secondo anello soggiorni utilizzo della memoria allo stesso livello. Ho pensato che fosse QList dinamica e sarebbe liberare la memoria quando l'elemento viene rimosso. Quindi, o mi manca qualcosa (molto probabile) o non è struttura dinamica. Avete delle idee su come farlo funzionare?

Saluti

È stato utile?

Soluzione

docs sembra che questo sia il comportamento previsto:

  

Si noti che la matrice interna sempre e solo diventa più grande per tutta la durata della lista. Non è mai restringe. La matrice interna si rilascia il distruttore e l'operatore di assegnazione, quando una lista è assegnato ad un altro.

Se si vuole de-allocare la memoria che hai un paio di opzioni

  1. Assicurati che il distruttore si chiama (tramite eliminare {supponendo che si new'd la lista in primo luogo}, o che consentono l'oggetto QList di uscire di portata)
  2. Assegna una lista vuota per il vostro grande lista (penso che questo funzionerà)

Altri suggerimenti

Mi ricordo la lettura di questo:

http: // cplusplus- soup.com/2010/01/05/freedelete-not-returning-memory-to-os/

Sembra può essere a che fare con il comportamento di allocazione di memoria / eliminazione, ma non sono sicuro al 100% di questo.

QList è parzialmente tra QVector (simile a std :: vector) e < a href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" rel = "nofollow noreferrer"> QLinkedList (simile elenco a std ::). QList detiene un array di puntatori agli oggetti stessi.

Questo schema significa che smistamento / riordinare l'elenco è veloce, ma il puntatore negozio cresce continuamente come elementi vengono aggiunti (simile ad un vettore). Così, la rimozione di elementi dalla lista libera la memoria utilizzata dalle voci, ma non il puntatore nella matrice.

Per recuperare la memoria, è necessario costruire un nuovo elenco. QVector ha squeeze (), ma che non sembra presente in QList.

QList è consigliato per gli elenchi di <1000 oggetti. Se è necessario gestire liste molto grandi e hanno bisogno della memoria da bonificare come oggetti vengono eliminati, si dovrebbe considerare l'utilizzo di QLinkedList.

Prova questo codice per liberare la memoria da QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top