获得seg错误,遇到类和变量问题

时间:2010-04-30 05:03:44

标签: c++ memory pointers class segmentation-fault

好的,所以我还在这里学习C ++的知识,所以如果这是一个简单的错误,我会道歉。

我有这堂课:

class RunFrame : public wxFrame {
public:
    RunFrame();
    void OnKey(wxKeyEvent& keyEvent);

private:
    //  Configuration variables.
    const wxString *title;
    const wxPoint *origin;
    const wxSize *size;
    const wxColour *background;
    const wxColour *foreground;
    const wxString *placeholder;

    //  Control variables.
    wxTextCtrl *command;

    //  Event table.
    DECLARE_EVENT_TABLE()
};

...然后在OnKey方法中我有这段代码:

void RunFrame::OnKey(wxKeyEvent& keyEvent) {
    //  Take the key and process it.
    if(WXK_RETURN == keyEvent.GetKeyCode()) {
        bool empty = command -> IsEmpty();
    }

    //  Propogate the event through.
    keyEvent.Skip();
}

...但是我的程序在到达我尝试从命令变量调用IsEmpty方法的行时会出现段错误。我的问题是,“为什么?”在RunFrame类的构造函数中,我似乎可以像在OnKey方法中那样调用命令变量的方法...并且它正确编译,它只是在我尝试执行该行时对我的错误进行了分析

如果需要,以下是构造函数的代码:

RunFrame::RunFrame() :
wxFrame(NULL, wxID_ANY, wxT("DEFAULT"), wxDefaultPosition, wxDefaultSize, wxBORDER_NONE) {
    //  Create the styling constants.
    title = new wxString(wxT("RUN"));
    origin = new wxPoint(0, 0);
    size = new wxSize(250, 25);
    background = new wxColour(33, 33, 33);
    foreground = new wxColour(255, 255, 255);
    placeholder = new wxString(wxT("command"));

    //  Set the styling for the frame.
    this -> SetTitle(*title);
    this -> SetSize(*size);

    //  Create the panel and attach the TextControl to it.
    wxPanel *panel = new wxPanel(this, wxID_ANY, *origin, *size, wxBORDER_NONE);

    //  Create the text control and attach it to the panel.
    command = new wxTextCtrl(panel, wxID_ANY, *placeholder, *origin, *size);

    //  Set the styling for the text control.
    command -> SetBackgroundColour(*background);
    command -> SetForegroundColour(*foreground);

    //  Connect the key event to the text control.
    command -> Connect(wxEVT_CHAR, wxKeyEventHandler(RunFrame::OnKey));

    //  Set the focus to the command box.
    command -> SetFocus();
}

预先感谢您提供任何帮助!

此致 celestialorb

2 个答案:

答案 0 :(得分:2)

您正在RunFrame对象以外的对象中捕获事件。可能它被捕获在wxFrame类型的基础对象中。使用运行时命令wxEvtHandler :: Bind<>()绑定事件而不是事件表,它应该变得清楚发生了什么。

要验证这是否是问题,请将RunFrame对象的地址与OnKey方法中的“this”指针进行比较。 Betcha他们是不同的。

更新:向我们展示您的事件表定义。这就是问题所在。

更新2:我必须离开你。也许这会更清楚:您的事件处理程序被定义为属于RunFrame。事件表(我认为)将事件绑定到另一个对象。结果是RunFrame :: OnKey不是用你的RunFrame对象的this-pointer调用的,而是一些其他对象,可能是不同类型的。祝好运。得走了。

答案 1 :(得分:0)

在调试器中,检查command函数中OnKey的值。

  • 检查command是否指向 内存无效(由于某种原因 命令对象被删除)
  • 或者命令是否指向NULL?