Infracción de acceso al llamar al método de la clase base

Soy bastante nuevo en C ++, por lo que probablemente me esté perdiendo algo obvio. Admito que no entiendo completamente cómo funciona el modelo de objetos, pero espero poder aprender algo de este problema...

Tengo una aplicación wxWidgets simple con un personalizado wxFrame clase. Conecta un evento y dentro de ese controlador de eventos, quiero establecer el título del marco. Sin embargo, cuando se ejecuta el controlador de eventos, el depurador muestra que la dirección del SetTitle la función es 0x00000000 y obtengo una excepción de violación de acceso.

class BrowserFrame : public wxFrame {
public:
    BrowserFrame();

    void OnChangeTitle(AweChangeTitleEvent& evt);

private:
    AweWebView* m_webView;
};

BrowserFrame::BrowserFrame() : wxFrame(NULL, wxID_ANY, wxGetApp().Name) {
    m_webView = new AweWebView(this, wxID_ANY);
    m_webView->Connect(aweEVT_CHANGE_TITLE, AweChangeTitleEventHandler(BrowserFrame::OnChangeTitle));
    m_webView->WebView()->LoadURL(Awesomium::WebURL(Awesomium::WSLit("http://www.google.com")));
}

void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
    SetTitle(evt.GetTitle()); // SetTitle == 0x00000000, Access violation
}

Mi primer pensamiento fue que el BrowserFrame estaba siendo destruido de alguna manera. Sin embargo, ese no parece ser el caso, porque puedo acceder a él con GetEventObject(). Esto funciona bien, por ejemplo:

void BrowserFrame::OnChangeTitle(AweChangeTitleEvent& evt) {
    static_cast<wxFrame*>(static_cast<wxWindow*>(evt.GetEventObject())->GetParent())->SetTitle(evt.GetTitle());
}

No puedo pensar en nada de lo que haya escrito que corromparía la tabla virtual de ninguna manera, excepto por un caso en el que administro mi propia memoria en un búfer de imagen. Eliminé por completo esa parte y sigo recibiendo la infracción de acceso en SetTitle, así que no creo que esa sea la fuente del problema.

¿Qué me estoy perdiendo?

preguntado el 29 de julio de 12 a las 22:07

¿Comprobaste qué evt.GetTitle() está regresando? -

Sí, devuelve un válido const wxString&. -

¿Tu ventana realmente se creó? Supongo que eso SetTitle() falla porque no hay ventana. -

@paddy: Sí, aparece la ventana. Como dije, puedo ejecutar con éxito SetTitle a través de una serie de lanzamientos, pero no directamente. -

¿Hacer limpia? Pasé horas persiguiendo errores que fueron causados ​​​​por un cambio en el tamaño de la clase y no se recompilaron todos los archivos de objetos. -

1 Respuestas

Logré arreglarlo. Intentaré explicar la solución lo mejor que pueda.

Si entiendo el problema correctamente, el controlador de eventos en realidad no estaba asociado con una instancia de BrowserFrame. Me cambié a la más moderna. Bind<>() método de conexión de eventos wxWidgets y le pasó la instancia de BrowserFrame:

m_webView->Bind(aweEVT_CHANGE_TITLE, &BrowserFrame::OnChangeTitle, this);

También tuve que actualizar mis declaraciones de eventos personalizados para que fueran compatibles con Bind<>(), pero después de eso, SetTitle() se llama y todo funciona muy bien.

Respondido 30 Jul 12, 03:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.