memoria dinamica in QList
-
19-09-2019 - |
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
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
- 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)
- 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();