2011-06-09 13 views
10

Estoy tratando de aprender wxWidgets, pero estoy atascado en un punto que no puedo encontrar una explicación para cualquier parte de la documentación. Estoy tratando de entender este programa mínimo wxWidgets:¿Por qué wxWidgets no filtra Frames?

#include <wx/wx.h> 

class MyApp : public wxApp 
{ 
    virtual bool OnInit(); 
}; 

IMPLEMENT_APP(MyApp) 

bool MyApp::OnInit() 
{ 
    wxFrame *frame = new wxFrame(NULL, -1, _("Hello World"), wxPoint(50, 50), 
            wxSize(450, 350));  
    frame->Show(true); 
    return true; 
} 

Específicamente, ¿cómo es que frame no se escape? ¿Cuándo se libera y de quién es la responsabilidad? En un programa normal, un puntero que no se pasa a nada y que sale del alcance sin ser eliminado es casi seguro una fuga, pero aparentemente esto no es así en wxWidgets.

+1

Podría registrarse con el marco, para ser eliminados cuando la ventana está cerrada. –

+0

@Xeo Este código proviene directamente del código de ejemplo en la documentación (recorte para enfatizar). No puedo encontrar ningún código de ejemplo en el que se elimine el cuadro, así que supongo que se elimina de alguna manera. Al mismo tiempo, no puedo encontrar nada en la documentación que indique específicamente que se borrará el Marco, así que espero que alguien en SO tenga la historia completa. – Mankarse

+0

Augh- Encontré la respuesta completa [aquí] (http://docs.wxwidgets.org/trunk/overview_windowdeletion.html). – Mankarse

Respuesta

3

Véase la nota en el ejemplo Hello World en el wiki wxWidgets:.

http://wiki.wxwidgets.org/Hello_World

"Usted podría preguntarse por qué la variable marco no se elimina ninguna parte Al establecer el marco como la ventana superior de la aplicación, la aplicación eliminará el marco para nosotros (para una explicación más detallada, consulte Cómo evitar fugas de memoria). "

Sin embargo, el código que ha publicado no llama al SetTopWindow() como lo hace el código del wiki. Entonces me imagino que se filtraría.

+0

No creo que esto sea realmente correcto. [La documentación] (http://docs.wxwidgets.org/trunk/classwx_app.html#39033ec4c79bc1871c91ada7b31941e6) establece que "No es necesario configurar la ventana superior, solo es una conveniencia". Acabo de encontrar la documentación para [wxTopLevelWindow] (http://docs.wxwidgets.org/trunk/classwx_top_level_window.html) que establece que "las instancias de wxTopLevelWindow están gestionadas por wxWidgets en la lista de ventanas de nivel superior interno". – Mankarse

+0

De acuerdo, bueno, es el nivel superior lo que hace que no se filtre ... y si está implícito que todos los wxFrames son de nivel superior, entonces supongo que sí. Qt no funciona de esa manera, por cierto. Voy a agregar que si no has probado Qt, está diseñado (y documentado) mucho mejor que wxWidgets: http://doc.qt.nokia.com/latest/tutorials-widgets-toplevel.html – HostileFork

+0

Tengo Miré QT, pero su [falta de seguridad de excepción] (http://developer.qt.nokia.com/doc/qt-4.8/exceptionsafety.html) me hace considerar que no es adecuado para ninguna aplicación para la que la corrección sea una prioridad . – Mankarse

-1

Se produce una pérdida de memoria cuando un programa sigue asignando memoria y nunca la libera. Eventualmente, tal programa se quedará sin memoria nueva para asignar y detener.

MyApp :: OnInit() se llama una vez al inicio del programa. La memoria para el marco se asigna una vez y se mantiene asignada hasta que el programa finaliza, que es exactamente lo que debe suceder. No hay pérdida de memoria porque el nuevo wxFrame en OnInit() se llama solo una vez.

Es muy posible que wxWidgets registre el puntero wxFrame y se encargue de ponerlo en orden si el programa se cierra correctamente. Eso sería bueno, pero no hace ninguna diferencia práctica.

+1

Existe una diferencia práctica. En primer lugar, si deja que el programa termine con un objeto dinámico sobresaliente ... el destructor nunca se ejecuta. Incluso si tiene un destructor trivial, todavía tiene un problema en el sentido de que es difícil distinguir una fuga de memoria "intencional" de este tipo de una "accidental" si está utilizando Valgrind u otra herramienta de generación de informes. – HostileFork

Cuestiones relacionadas