私は 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());
}
画像バッファーで独自のメモリ管理を行う 1 つのインスタンスを除いて、v テーブルを何らかの形で破損するような記述は考えられません。私はその部分を完全に削除しましたが、それでもアクセス違反がSetTitle
発生するため、それが問題の原因ではないと思います。
私は何が欠けていますか?