当我尝试写入wxListBox(C ++,wxWidgets,CodeBlocks)时,我得到一个SIGSEGV,Segmentation错误

时间:2014-08-05 22:28:17

标签: c++

我正在编写的程序可以构建并从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;

但这次,当按下按钮(调用处理函数)时,我收到此消息:

Error Message


我的代码中要纠正什么才能使程序正常运行?

1 个答案:

答案 0 :(得分:2)

成员wxListBox *m_listboxSorted;未初始化。

  

wxListBox * m_listboxSorted = new wxListBox(constructor info ...);

构造函数中的

不会为成员赋值,而是声明一个在构造函数返回时泄露的本地指针。

  

m_listboxSorted-> SetString(k," some text");

然后取消引用未初始化的成员指针,导致未定义的行为。

要修复,请从构造函数中的行中删除该类型,使其成为赋值而不是声明。