Pregunta

No tengo mucha experiencia con QT y este problema salió hoy.

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

Después de primer bucle al comprobar el uso de memoria que sube como nuevos elementos se añaden al memList pero después de la eliminación de ellos dentro de segundo bucle de las estancias de uso de memoria en el mismo nivel. Yo pensaba que era QList dinámico y sería liberar memoria cuando se elimina elemento. Así que, o me estoy perdiendo algo (muy probable) o no lo es estructura dinámica. ¿Tiene alguna idea de cómo hacer que funcione?

Regards

¿Fue útil?

Solución

Desde el docs parece que este es el comportamiento esperado:

  

Tenga en cuenta que la matriz interna sólo alguna vez se hace más grande durante la vida de la lista. Nunca se encoge. La matriz interna se desasigna por el destructor y por el operador de asignación, cuando se asigna una lista a otra.

Si desea desasignar la memoria que tienes un par de opciones

  1. Asegúrese de que el destructor se llama (usando eliminar {suponiendo que new'd la lista en el primer lugar}, o permitir que el objeto QList salir del ámbito)
  2. Asignar una lista vacía a su lista grande (creo que esto va a funcionar)

Otros consejos

Recuerdo haber leído acerca de esto:

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

Parece que puede ser que ver con el comportamiento de la memoria de asignación / eliminación, pero no estoy 100% seguro de eso.

QList es parcialmente entre QVector (similar a std :: vector) y < a href = "http://qt.nokia.com/doc/4.6/qlinkedlist.html" rel = "nofollow noreferrer"> QLinkedList (similar a std :: lista). QList contiene una matriz de punteros a los objetos mismos.

Este esquema significa que la clasificación / reordenar la lista es rápido, pero el puntero de la tienda crece continuamente a medida que se agregan elementos (similar a un vector). Por lo tanto, la eliminación de elementos de la lista libera la memoria utilizada por los objetos, pero no el puntero en la matriz.

Para recuperar la memoria, es necesario construir una nueva lista. QVector tiene squeeze (), pero que no parece presente en QList.

QList se recomienda para las listas de objetos <1000. Si usted necesita para manejar listas muy grandes y necesita la memoria para ser reclamado como se eliminan los objetos, se debe considerar el uso de QLinkedList.

Prueba este código para liberar memoria de QList

while( ! memList.isEmpty() )
    delete memList.takeFirst();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top