wxWidgets wxTextCtrl在删除时崩溃

wxWidgets wxTextCtrl crash when deleting

本文关键字:崩溃 删除 wxTextCtrl wxWidgets      更新时间:2023-10-16

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";
   }

我认为您对Connect()的理解有问题。如果使用它连接到另一个对象的方法,则必须传递指向该对象的指针作为最后一个参数(在文档中称为eventSink(。几乎可以肯定,您的方法是在错误的对象指针上调用的。

你绝对不应该像在OnEnter()中那样投this

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

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