C++ wxWidgets开发构造函数外调用wxGauge报nullptr异常怎么解决
问题根源
你触发空指针异常的核心原因是事件绑定逻辑错误,导致回调函数执行时上下文对象不对:
- 调用
btn->Connect绑定事件时没有指定事件处理的上下文对象,默认会以调用Connect的按钮实例作为回调的执行上下文,当Importar函数触发时,函数内部的this指针实际指向的是按钮对象,而非你预期的testGauge窗口实例,此时访问testGauge类的成员变量wx_MyGauge就会读取到非法内存,抛出空指针异常。
修复方案
方案1:补全Connect参数
给Connect方法补充最后一个eventSink参数,指定回调在当前testGauge实例的上下文下执行:
// 替换原来的btn->Connect行 btn->Connect(wxEVT_LEFT_UP, wxMouseEventHandler(testGauge::Importar), nullptr, this);
方案2:使用wxWidgets 3.x推荐的Bind方法(更安全)
Bind是类型安全的事件绑定接口,不需要手动指定事件转换宏,也不容易出现上下文绑定错误,写法如下:
// 替换原来的btn->Connect行 btn->Bind(wxEVT_LEFT_UP, &testGauge::Importar, this);
额外优化建议
回调函数内访问成员变量不需要加类名前缀,testGauge::wx_MyGauge可以直接简化为wx_MyGauge。
内容的提问来源于stack exchange,提问作者Maicon
相关产品推荐
相关产品推荐

