wxWidgets wxTextCtrl在删除时崩溃

问题描述:

当试图删除或更改其值时,wxTextCtrl会导致一些内存分配问题。这里有一些代码见解:wxWidgets 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的唯一功能的一些实际代码:调用的SetValue

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

和功能()

void AddButton::OnEnter(wxCommandEvent& event)//enter button handler 
    { 
     wxTextCtrl* _t = (wxTextCtrl*)this; 
     _Clear(); 
     *_t<<"sup"; 
    } 
+0

在你的代码的其他地方显然存在一个错误,你必须明白,调用'SetValue()'不会崩溃,如果没有其他地方没有错。但是你不会告诉我们关于你的其他代码的任何信息,因此无法帮助你。 – 2013-03-17 23:13:22

+0

@VZ。在那里我添加了更多的代码。我正在使用IMPLEMENT_APP宏实现该应用程序。其他一切都像往常一样,因为它可以是... – 2013-03-17 23:25:27

我觉得您在理解Connect()时遇到问题。如果您使用它连接到不同对象的方法,则您必须必须将作为最后一个参数(在the documentation中称为eventSink)传递此对象的指针。你的方法几乎肯定会被错误的对象指针调用。

而且你应该绝对不会像OnEnter()那样必须铸造this

+0

即使将此传递给Connect以及其他许多随机尝试,它仍会继续崩溃。但是,我从版本2.9.5切换到2.8,并且当我以正确的方式使用Connect()时,这个问题已经消失。谢谢。 – 2013-03-18 22:51:37

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

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

+0

@T_Rex我试图从sizer分离它仍然崩溃。也尝试从sizer中分离它的父项,但没有任何项目仍然崩溃。另外,我并不需要删除wxTextCtrl,但是当我尝试'wxTextCtrl :: SetValue(“”);'因为'wxTextCtrl :: Clear()'不起作用而删除条目时会发生同样的错误。 – 2013-03-17 22:58:20

+0

@T_Rex是的,我已经尝试过。我在Windows 7上使用了wxWidgets-2.9.5 Visual Studio 2010.另外,我将在编辑中加入更多代码,希望对您有所帮助。 – 2013-03-17 23:18:36

+0

@T_Rex在这里它是 – 2013-03-17 23:24:31