lo que el uso de Qt mucho con mi desarrollo y encanta. El patrón de diseño habitual con objetos Qt es asignarlos usando new
.Política con std :: captura bad_alloc
Casi todos los ejemplos (especialmente el código generado por el diseñador de Qt) no comprueban absolutamente la excepción std::bad_alloc
. Dado que los objetos asignados (generalmente widgets y demás) son pequeños, esto casi nunca es un problema. Después de todo, si no puede asignar algo así como 20 bytes, es probable que no haya mucho que pueda hacer para solucionar el problema.
Actualmente, he adoptado una política de ajuste de asignaciones "grandes" (cualquier cosa sobre una página o dos en tamaño) en un try/catch. Si eso no funciona, puedo mostrar un mensaje al usuario, casi cualquier cosa más pequeña, sólo voy a dejar que el accidente de aplicación con una excepción std::bad_alloc
.
tanto, me pregunto lo que las escuelas de pensamiento sobre esto son en esto?
¿Es una buena política verificar todas y cada una de las operaciones new
? ¿O solo los que espero tener el potencial de fallar?
Además, es claramente una historia completamente diferente cuando se trata de un entorno integrado donde los recursos pueden ser mucho más restringidos. Pregunto en el contexto de una aplicación de escritorio, pero también estaría interesado en respuestas que involucren otros escenarios.
de hecho nothrow new es una opción viable, pero si hay algunas asignaciones en un bloque de código dado, será mucho más detallado que el simple uso de un bloque try/catch. Estoy totalmente de acuerdo en que "qué hacer" es la verdadera pregunta, ya que los escenarios sin memoria realmente limitan cuánto puede hacer para arreglar las cosas. –
No tanto "qué hacer", sino "¿se puede hacer algo?" – jalf
Si lo captas lo suficientemente alto, es posible que parte de la memoria se haya liberado durante el desenrollado de la pila. Puedes asegurarte de que algo se libere, utilizando un nuevo manipulador o trucos como 'int flag = false; try {vector v (1000); flag = verdadero; doEventLoop(); } catch (bad_alloc) {if (flag) cout << "Tengo 4k para usar para solicitar al usuario \ n"; } ' –