viernes, 5 de abril de 2019

Memory leak con QIcon en Qt 5.9.4 y solución

Tras realizar una de las migraciones de Qt 4.7.4 a Qt 5.9.4 y hacer las correspondientes cambios según la guia de diseño (aquí tenéis más detalles de la misma: Migrating from Qt4 to Qt5). Nos encontramos que nuestra aplicación terminaba crasheando y no encontrábamos la razón. Tras ir analizando paso a paso que estaba pasando y dónde se iba la memoria, encontramos que el árbol que tengo QTreeWidget, lo tengo decorado con iconos QIcon.

En mi caso, requiero un montón de elementos (+200) en el árbol y siguen creciendo ya que es el elemento central de mi aplicación (un IDE especifico). Para la carga de las imágenes utilizaba recursos internos, inicializados de la siguiente manera:

QStandardItem* myItem = new QStandardItem(tr("Item name")); 
myItem->setIcon(QIcon(":/Icons/iconName.png"));

En modo DEBUG este tipo de inicialización llegaba a consumir hasta casi 50MB en memoria por cada elemento del árbol. Tras mucho googlear, encontré en QtCentre.org una entrada similiar (link) y y también el bug relacionado (enlace BUG) (sin correción en el momento que escribo).

Lo que se puede hacer para evitar ese consumo de memoria excesivo, es inicializar el objeto de QIcon utilizando el constructor al que se le pasa un objeto de QPixmap. En el caso anterior sería:


QStandardItem* myItem = new QStandardItem(tr("Item name")); 
myItem->setIcon(QIcon(QPixmap(":/Icons/iconName.png")));

Al final, el problema se encuentra con la inicialización del objeto por defecto. Aún haciendo esto, hay que tener ene mente que no estamos haciéndolo igual y tenemos en algún lugar que hacer algún cambio extra en el código. Por ejemplo, en mi caso tuve que en otro lugar hacer un resize de la imagen.






No hay comentarios:

Publicar un comentario

Problemas con python "/usr/bin/env < < python>>: No such file or directory "

Es posible que hayas llegado aquí por un mensaje similar al siguiente:  /usr/bin/env: <<python>>: No such file or directory   Cu...