代码之家  ›  专栏  ›  技术社区  ›  Red_Dot

wxWidgets wxTextCtrl在删除时崩溃

  •  -1
  • Red_Dot  · 技术社区  · 12 年前

    wxTextCtrl在试图删除或更改其值时会导致一些内存分配问题。以下是一些代码见解:

        wxTextCtrl* s = new wxTextCtrl(...);
        s->SetValue("abc");//crash
        delete s//crash
    

    它的所有成员都是const的。以下是VisualStudio在崩溃时的说明:

        An unhandled exception of type 'System.AccessViolationException' 
        occurred in Unknown Module.
    
        Additional information: Attempted to read or write protected memory. 
        This is often an indication that other memory is corrupt.
    

    即使我尝试wxWidgets默认销毁:

        parent->DestroyChildren(); //ofc the parent is wxPane passed in constructor of s
    

    任何帮助都将不胜感激。

    以下是仅调用wxTextCtrl的函数中的一些实际代码:

      void AddButton::OnAction(wxSize* frame){
    
    if ( !DoAction ){
        if ( ! thy )
        {
    
            thy = new wxPanel
                (mParent, -1, 
                wxPoint(0, 0),
                wxSize(PanelWidth, mParent->GetSize().GetHeight()), 
                wxBORDER_NONE | wxFRAME_FLOAT_ON_PARENT );
            thy->SetBackgroundColour(wxColor(30,30,30));
            thy->Show();
            if ( ! AddPanelDialog ){
                //AddPanelDialog = (new _Text
                    //(this, thy, "add link...", wxPoint(1, 30), wxSize(PanelWidth - 30, 20),
                    //wxBORDER_NONE | wxTE_PROCESS_ENTER ));
                wxTextCtrl* s = new wxTextCtrl(thy, -1, "", wxPoint(1, 30), wxSize(PanelWidth - 30, 20),
                    wxBORDER_NONE | wxTE_PROCESS_ENTER );
                s->Connect(wxEVT_COMMAND_TEXT_ENTER, wxCommandEventHandler(_Text::OnEnter));
                s->Show();
            }
            if ( !ConfirmPanel ){
                ConfirmPanel = new wxPanel
                    (thy, -1, wxPoint(PanelWidth - 28, 30), wxSize(27, 20), 
                    wxBORDER_NONE | wxFRAME_FLOAT_ON_PARENT );
                ConfirmPanel->SetBackgroundColour(wxColor(38, 145, 232));
                ConfirmPanel->Show();
            }
    
        }
        else {
            thy->Show();
        }
        gui* rmd = (gui*)mParent;
        rmd->LeftPanelActivate();
        rmd->SetNewPositions(rmd->GetParent()->GetSize());
        Button::Update();
        helper::SendRedrawEvent(mParent);
        DoAction = true; // indicates action activated
    }
    else{
        thy->Hide();
        gui* rmd = (gui*)mParent;
        rmd->LeftPanelActivate(false);
        rmd->SetNewPositions(rmd->GetParent()->GetSize());
        Button::Update();
        helper::SendRedrawEvent(mParent);
        DoAction = false; // indicates action activated
    }
        }
    

    和调用SetValue()的函数

       void AddButton::OnEnter(wxCommandEvent& event)//enter button handler
       {
           wxTextCtrl* _t = (wxTextCtrl*)this;
           _Clear();
           *_t<<"sup";
       }
    
    2 回复  |  直到 12 年前
        1
  •  1
  •   VZ.    12 年前

    我认为你对 Connect() 。如果您正在使用它连接到不同对象的方法,则 必须 将指向该对象的指针作为最后一个参数(调用 eventSink 在里面 the documentation ). 您的方法几乎可以肯定是在错误的对象指针上被调用的。

    而且你绝对不应该,永远不应该 this 就像你在 OnEnter() .

        2
  •  1
  •   T-Rex    12 年前

    你确定你真的需要删除wxTextCtrl吗?如果将此文本控件放入sizer中,那么sizer将对其负责,并在需要时销毁它。您可能需要将文本控件与sizer分离,然后将其删除。 你也应该使用 Destroy() 方法而不是 delete 操作人员这在文档中有明确的解释。

    至于碰撞 SetValue() 电话:你试过用吗 wxT("abc") ? 此外,您正在使用什么版本的wxWidgets、操作系统和编译器?wxWidgets根本没有遇到过这样的问题。也许你可以发布一些有意义的代码来帮助识别问题?