【问题标题】:wxWidgets wxTextCtrl crash when deletingwxWidgets wxTextCtrl 删除时崩溃
【发布时间】:2013-03-17 22:32:31
【问题描述】:

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

【问题讨论】:

  • 你的代码的其他地方明显有bug,你必须明白,如果其他地方没有问题,调用SetValue()不会崩溃。但是您没有告诉我们有关您的其余代码的任何信息,因此无法为您提供帮助。
  • @VZ。在那里我添加了更多代码。我正在使用 IMPLEMENT_APP 宏实现该应用程序。其他一切都像往常一样......

标签: c++ visual-studio-2010 wxwidgets


【解决方案1】:

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

而且您绝对不应该像在 OnEnter() 中那样投射 this。

【讨论】:

  • 即使将它传递给 Connect 和许多其他随机尝试,它仍然会继续崩溃。但是,我从 2.9.5 版本切换到 2.8 版本,当我以正确的方式使用 Connect() 时,这个问题就消失了。谢谢。
【解决方案2】:

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

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

【讨论】:

  • @T_Rex 我尝试将它与尺寸测定器分离,但仍然发生崩溃。还尝试将其父级与 sizer 分离,但仍然没有崩溃。另外,我真的不需要删除 wxTextCtrl,但是当我尝试 wxTextCtrl::SetValue(""); 删除条目时会发生同样的错误,因为 wxTextCtrl::Clear() 不起作用。
  • @T_Rex 是的,我已经尝试过了。我在 Windows 7 上使用 wxWidgets-2.9.5 Visual Studio 2010。此外,我将在编辑中添加更多代码,希望对您有所帮助。
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多