Frage

Ich habe nicht viel Erfahrung mit QT haben und dieses Problem kam heute.

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

Nach dem ersten Schleife, wenn ich die Speichernutzung überprüfen Sie sie nach oben geht als neue Elemente an die memList angehängt werden, aber nachdem sie diese im zweiten Schleife, um die Speicherauslastung bleibt auf dem gleichen Niveau zu entfernen. Ich dachte, dass QList war dynamisch und es würde Speicher frei, wenn das Element entfernt wird. Also entweder ich bin fehlt etwas (sehr wahrscheinlich), oder es ist nicht dynamische Struktur. Haben Sie irgendwelche Ideen haben, wie man es?

Viele Grüße

War es hilfreich?

Lösung

Von der docs es scheint, dass dies das erwartete Verhalten ist:

  

Beachten Sie, dass das interne Array wird nur immer größer über die Lebensdauer der Liste. Es schrumpft nie. Die interne Anordnung wird durch die destructor und durch den Zuweisungsoperator freigegeben, wenn eine Liste in einer anderen zugeordnet ist.

Wenn Sie den Speicher, um de-zuweisen möchten Sie haben ein paar Optionen bekam

  1. Stellen Sie sicher, dass der Destruktor aufgerufen wird (Löschen mit {vorausgesetzt, Sie die Liste an erster Stelle new'd} oder das Erlauben der QList Objekt Spielraum zu gehen)
  2. Assign eine leere Liste an Ihre große Liste (man denke dies funktionieren wird)

Andere Tipps

Ich erinnere Lesen dazu:

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

Es scheint, es sein kann, mit Speicherzuweisung / Löschverhalten zu tun, aber ich bin nicht 100% sicher.

QList ist teilweise zwischen QVector (ähnlich wie std :: vector) und < a href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" rel = "nofollow noreferrer"> QLinkedList (ähnlich wie std :: list). QList enthält ein Array von Zeigern auf die Objekte selbst.

Dieses Schema bedeutet, dass das Sortieren / die Liste Nachbestellung ist schnell, aber die Zeiger-Speicher wachsen kontinuierlich als Elemente hinzugefügt (ähnlich einen Vektor). Somit wird durch die Elemente verwendet, um Elemente aus der Liste gibt den Speicher zu entfernen, aber nicht um den Zeiger im Array.

zurückzufordern Speicher, müssen Sie eine neue Liste erstellen. QVector hat Squeeze (), aber das scheint nicht in QList.

QList ist für Listen von <1000 Objekte empfohlen. Wenn Sie sehr große Listen behandeln müssen und müssen die Speicher zurückgewonnen werden als Objekte gelöscht werden, sollten Sie die Verwendung QLinkedList betrachten.

Versuchen Sie diesen Code, um Speicher frei von QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top