C++ wxStaticText::SetLabel()分段错误
我是wxWidgets的新手,我想在ubuntu上制作一个简单的GUI应用程序作为参考 我创建了一个简单的窗口,添加了一些按钮,并在按钮事件处理程序中更新wxStaticText对象在屏幕上的文本,以指示按下了哪个按钮 但是,当我调用wxStaticText继承的SetLabel或SetLabelText函数时,就会出现分段错误 也许我遗漏了什么,wxStaticText无法设置标签,我需要另一个控件。但是我在班级名单上找不到类似的东西 我正在使用来自codelite存储库的wxWidgets 3.1.4 MainFrame.cpp 包括大型机 包括 //具有简单常量的SEGFULTS/BUG需要是静态的 静态常量字符*标题; 常量int大型机::PX=30; 常量int大型机::PY=30; const int MainFrame::SX=400; const int MainFrame::SY=300; 大型机::大型机 :wxFramenullptr,static_castIDs::MainFrame,wxStringTITLE,wxPointPX,PY,wxSizeSX,SY { //创建栏 //不需要调用delete.new为wx元素重载。 菜单栏=新的wxMenuBar; //创建菜单 menuFile=新的wxMenu; //菜单项文件 menuItemClose=new wxMenuItemmenuFile,static_castIDs::menuItemClose,Exit,关闭应用程序; ConnectmenuItemClose->GetId,wxEVT_菜单,wxCommandEventHandlerMainFrame::onClickMenuItemClose; 菜单文件->附录菜单关闭; //从菜单构造菜单栏 菜单栏->附录菜单文件,文件; 此->设置菜单栏; //杂项 lbl_Text=new wxStaticTextthis,wxID_ANY,按下按钮!; //创建尺码器 gridSizer=新的wxGridSizer1,5,wxSize5,5; boxSizer=新wxBoxSizerwxVERTICAL; boxSizer->Addlbl\u文本, 0,//使向量不可拉伸 wxALL,//隐式顶部对齐,四周边框 10//10像素 ; boxSizer->AddgridSizer,1,wxEXPAND,0; 此->设置SizerAndFoxSizer; //创建按钮 v_btn_按钮=标准::使_唯一5; 对于int i=0;i<5;i++ { wxstringtxt=wxStringfmt::formatButton{0},i+1.c_str;C++ wxStaticText::SetLabel()分段错误,c++,segmentation-fault,wxwidgets,C++,Segmentation Fault,Wxwidgets,我是wxWidgets的新手,我想在ubuntu上制作一个简单的GUI应用程序作为参考 我创建了一个简单的窗口,添加了一些按钮,并在按钮事件处理程序中更新wxStaticText对象在屏幕上的文本,以指示按下了哪个按钮 但是,当我调用wxStaticText继承的SetLabel或SetLabelText函数时,就会出现分段错误 也许我遗漏了什么,wxStaticText无法设置标签,我需要另一个控件。但是我在班级名单上找不到类似的东西 我正在使用来自codelite存储库的wxWidgets
std::cout很难看到,因为这里有太多的代码。您应该尽量减少示例,删除所有不相关的部分,但问题的根本原因是这一行:
btn->Connect(wxEVT_BUTTON, wxCommandEventHandler(MainFrame::onClickButton));
在这里,您将大型机的一个方法连接到一个wxButton对象,该对象最终在一个错误类的对象上调用一个类方法,并产生预期的致命结果
您需要提供帧指针,即此as Connect eventSink参数,以便在正确的对象上调用它。或者,您可以调用此->Connect,因为此时要连接的对象和用于调用的对象是相同的
最后,为了确保将来不会犯此类错误,请不要使用Connect,而是使用类型安全绑定。如果在此处使用,则此调用不会编译,而不会在运行时崩溃。//带有简单常量的segfaults/bugs需要是静态的,这表明您可能隐藏了一个bug。可能是相同的bug y您现在正在与之斗争。可能是另一个错误。很难说。@user4581301我认为这是由于在initilizer list/base-ctor调用期间声明了常量,但没有初始化,为base-ctor调用提供了未初始化的变量。将void-MainFrame::onClickMenuItemClosewxCommandEvent&evt更改为void MainFrame::onClickMenuItemClosewxCommandEvent&。如果不给参数一个名称,编译器知道它没有在函数中使用,即使函数仍然需要参数。@user4581301 wx提供了一个函数/宏wxUnusedVar;它在所有示例中都被使用。我现在实现了它。但它与此无关。@FalcoGer,whe崩溃到底发生了什么?你调试代码了吗?
0 0x0000555555950050 ??
1 0x0000555555566e85 MainFrame::onClickButton /home/paul/Documents/Projects/wxTest/MainFrame.cpp 77
2 0x00007ffff758f091 wxEvtHandler::ProcessEventIfMatchesId /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../include/wx/app.h 462
3 0x00007ffff758f091 wxEvtHandler::ProcessEventIfMatchesId /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1400
4 0x00007ffff758f52e wxEvtHandler::SearchDynamicEventTable /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1897
5 0x00007ffff758f8b4 wxEvtHandler::TryHereOnly /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1618
6 0x00007ffff758f95f wxEvtHandler::TryBeforeAndHere /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../include/wx/event.h 3927
7 0x00007ffff758f95f wxEvtHandler::ProcessEventLocally /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1555
8 0x00007ffff758fa61 wxEvtHandler::ProcessEvent /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1528
9 0x00007ffff7590f8b wxEvtHandler::SafelyProcessEvent /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/event.cpp 1646
10 0x00007ffff7be5db0 wxWindowBase::HandleWindowEvent /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../include/wx/window.h 852
11 0x00007ffff7a1ba02 wxgtk_button_clicked_callback /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/gtk/button.cpp 38
12 0x00007ffff62dba56 ??
13 0x00007ffff62fab28 g_signal_emit_valist
14 0x00007ffff62fb0d3 g_signal_emit
15 0x00007ffff68f92ae ??
16 0x00007ffff68f9318 ??
17 0x00007ffff62db802 g_closure_invoke
18 0x00007ffff62ef962 ??
19 0x00007ffff62fab9e g_signal_emit_valist
20 0x00007ffff62fb0d3 g_signal_emit
21 0x00007ffff68f7754 ??
22 0x00007ffff6ba8a71 ??
23 0x00007ffff62dba56 ??
24 0x00007ffff62fab28 g_signal_emit_valist
25 0x00007ffff62fb0d3 g_signal_emit
26 0x00007ffff69bff5c ??
27 0x00007ffff62dec56 g_cclosure_marshal_VOID__BOXEDv
28 0x00007ffff62dba56 ??
29 0x00007ffff62fab28 g_signal_emit_valist
30 0x00007ffff62fb0d3 g_signal_emit
31 0x00007ffff69bcfa2 ??
32 0x00007ffff69be5eb ??
33 0x00007ffff69c15d6 ??
34 0x00007ffff6988bb0 gtk_event_controller_handle_event
35 0x00007ffff6b4b0fd ??
36 0x00007ffff6ba248b ??
37 0x00007ffff62db802 g_closure_invoke
38 0x00007ffff62eef96 ??
39 0x00007ffff62fa45d g_signal_emit_valist
40 0x00007ffff62fb0d3 g_signal_emit
41 0x00007ffff6b4cbb3 ??
42 0x00007ffff6a080b8 ??
43 0x00007ffff6a0a36b gtk_main_do_event
44 0x00007ffff66f2f79 ??
45 0x00007ffff6726106 ??
46 0x00007ffff61effbd g_main_context_dispatch
47 0x00007ffff61f0240 ??
48 0x00007ffff61f0533 g_main_loop_run
49 0x00007ffff6a0930d gtk_main
50 0x00007ffff79b0e95 wxGUIEventLoop::DoRun /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/gtk/evtloop.cpp 64
51 0x00007ffff7445731 wxEventLoopBase::Run /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/evtloopcmn.cpp 90
52 0x00007ffff740fa2a wxAppConsoleBase::MainLoop /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../src/common/appbase.cpp 380
53 0x00007ffff749a83a wxEntry /home/david/devel/packages/wx/3.1.4/wxwidgets3.1-3.1.4/objs_gtk_sh/../include/wx/app.h 462
54 0x000055555558c082 main /home/paul/Documents/Projects/wxTest/main.cpp 13
55 0x00007ffff6f910b3 __libc_start_main /build/glibc-YYA7BZ/glibc-2.31/csu/../csu/libc-start.c 308
56 0x000055555556625e _start
btn->Connect(wxEVT_BUTTON, wxCommandEventHandler(MainFrame::onClickButton));