调用基类的方法时发生访问冲突
Access violation when calling method of base class
我对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()
被调用,一切都很好。
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 初始化指向类实例的智能指针并访问其方法
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 工厂方法中的访问冲突
- Box2d C++访问冲突使用b2fixture超出方法
- 调用基类的方法时发生访问冲突
- 如何解决调用 dll 方法时的访问冲突写入位置
- 在鼠标钩子代码中调用方法会导致访问冲突
- 访问dll方法时的访问冲突读取位置
- 访问冲突直接x更新方法
- 尝试返回同一类中的私有变量时C++ "Getter"方法抛出访问冲突