Q_ASSERT y QT 4.7.3

Qt

Encontré un pequeño problema en Kata Kuntur, gracias a que fui a unas clases de Base de Datos en la que usan mi herrmienta, me di con la ingrata sorpresa de que el modelador obtenia un crash cuando a veces se creaban relaciones o incluso cuando se movia una entidad cuando antes se eliminaban relaciones.

Me tomó mucho tiempo averiguar por qué ocurria eso pero la conclusión final llegó ..... el problema era Q_ASSERT.

Q_ASSERT sirve para evaluar condiciones, aquí un  ejemplo extraído de l documentación de Qt:

// File: div.cpp

 #include <qtglobal>

 int divide(int a, int b)
 {
     Q_ASSERT(b != 0);
     return a / b;
 }

Suelo usar la macro Q_ASSERT para evaluar condiciones, como por ejemplo:

  • Verficar si un ítem ha sido eliminado(list.remove(obj)).
  • Verificar si un índice es válido (index.isValid()).
  • Verificar la diferencia de objetos(obj!=obj1).

Resulta que tenía una línea de código similar a esta:

Q_ASSERT(listItems.removeOne(item));
delete item;

Como la función removeOne() devuelve un valor booleano no tube mejor idea que colocarlo en el Q_ASSERT para que me pueda avisar en caso de que el objeto item no haya sido eliminado, pues, la verdad funciona pero solo cuando compilo mi proyecto como Debug. Cuando compilo como Release esa línea de código nunca se llegaba a ejecutar, y por lo tanto tenia problemas, por que listItems es usado en otras clases. Recuerdo que esto no me solia suceder con las veriones anteriores de Qt, pero con la versión actual que uso (la 4.7.3) sí me ocurre. Pero bueno, lo correcto seria usarlo de esta manera:

Q_ASSERT(listItems.contains(item));
listItems.removeOne(item);
delete item;

Con la función contains() se puede determinar si el objeto ítem está dentro de la lista, si no está pues me lanzará un ASSERT en la línea de depuración, cuando lo compile en modo Release esa línea se ignorara y simplemente no pasa nada.