我正在编写的程序可以构建并从CodeBlocks IDE执行,但按下特定按钮(调用处理函数)会导致程序崩溃。在调试器模式下,我收到此消息:
Program received signal SIGSEGV, Segmentation fault.
它发生在行中:
m_listboxSorted->SetString(k, "some text");
我的程序的最小版本,我希望包含代码的所有重要部分,是:
class MainFrame: public wxFrame
{
public:
wxListBox *m_listboxSorted;
};
bool TestApp::OnInit()
{
MainFrame* OurMainFrame = new MainFrame(constructor info... );
OurMainFrame->Show( true );
return true;
}
MainFrame::MainFrame(constructor info...)
{
wxListBox * m_listboxSorted = new wxListBox(constructor info...);
}
void MainFrame::ButtonClicked(wxCommandEvent & event)
{
static unsigned int k = 0 ;
k++;
m_listboxSorted->SetString(k, "some text"); // !! Problematic line !!
}
现在,在线搜索信号SIGSEGV,分段错误的解决方案后,我发现问题必须在指针中,并解除引用它。但作为初学者,我没有成功应用这些信息来解决我的程序问题。
编辑:
我也试图改变这一行:
wxListBox *m_listboxSorted;
这一个:
wxListBox *m_listboxSorted = new wxListBox;
但这次,当按下按钮(调用处理函数)时,我收到此消息:
我的代码中要纠正什么才能使程序正常运行?
答案 0 :(得分:2)
成员wxListBox *m_listboxSorted;
未初始化。
构造函数中的wxListBox * m_listboxSorted = new wxListBox(constructor info ...);
不会为成员赋值,而是声明一个在构造函数返回时泄露的本地指针。
m_listboxSorted-> SetString(k," some text");
然后取消引用未初始化的成员指针,导致未定义的行为。
要修复,请从构造函数中的行中删除该类型,使其成为赋值而不是声明。