调用基类的方法时发生访问冲突

Access violation when calling method of base class

本文关键字:访问冲突 方法 基类 调用      更新时间:2023-10-16

我对C++还很陌生,所以我可能缺少一些明显的东西。我承认我不完全理解对象模型是如何工作的,但我希望我能从这个问题中学到一些东西。。。

我有一个带有自定义wxFrame类的简单wxWidgets应用程序。它挂接一个事件,在该事件处理程序中,我想设置帧的标题。然而,当事件处理程序执行时,调试器显示SetTitle函数的地址是0x00000000,并且我得到了一个访问冲突异常。

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
}

我的第一个想法是BrowserFrame不知怎么被破坏了。但事实并非如此,因为我可以使用GetEventObject()访问它。这很好,例如:

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

我想不出我写的任何东西会以任何方式破坏v表,除了一个我自己在图像缓冲区上进行内存管理的例子。我已经完全删除了这一部分,但在SetTitle上仍然存在访问冲突,所以我不认为这是问题的根源。

我错过了什么?

我设法解决了它。我会尽力解释解决方案。

如果我正确理解了这个问题,那么事件处理程序实际上并没有与BrowserFrame的实例相关联。我切换到连接wxWidgets事件的更现代的Bind<>()方法,并将BrowserFrame:的实例传递给它

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

我还必须更新我的自定义事件声明,使它们与Bind<>()兼容,但在那之后,SetTitle()被调用,一切都很好。