【问题标题】:Access violation when calling method of base class调用基类方法时访问冲突
【发布时间】:2012-07-29 21:15:45
【问题描述】:

我对 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-table,除了我在图像缓冲区上进行自己的内存管理的一个实例。我已经完全删除了那部分,但仍然在SetTitle 上遇到访问冲突,所以我认为这不是问题的根源。

我错过了什么?

【问题讨论】:

  • 你检查evt.GetTitle()返回的内容了吗?
  • 是的,它返回一个有效的const wxString&amp;。
  • 你的窗口真的被创建了吗?我猜SetTitle() 失败是因为没有窗口。
  • @paddy:是的,窗口出现了。就像我说的,我可以通过一系列强制转换成功执行SetTitle,但不能直接执行。
  • 清洁?我花了好几个小时追查由于类大小变化而不是所有目标文件都被重新编译而引起的错误。

标签: c++ wxwidgets access-violation


【解决方案1】:

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

如果我正确理解了问题,则事件处理程序实际上并未与 BrowserFrame 的实例相关联。我切换到更现代的Bind&lt;&gt;() 连接wxWidgets 事件的方法,并将BrowserFrame 的实例传递给它:

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

我还必须更新我的自定义事件声明以使其与Bind&lt;&gt;() 兼容,但之后,SetTitle() 被调用并且一切正常。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    相关资源
    最近更新 更多