C++ wxWidgets WXTEXTCRL在删除时崩溃

C++ wxWidgets WXTEXTCRL在删除时崩溃,c++,visual-studio-2010,wxwidgets,C++,Visual Studio 2010,Wxwidgets,WXTEXTCRL在尝试删除或更改其值时会导致内存分配问题。下面是一些代码细节: wxTextCtrl* s = new wxTextCtrl(...); s->SetValue("abc");//crash delete s//crash 它的所有成员都是康斯特的。VisualStudio崩溃时会说: An unhandled exception of type 'System.AccessViolationException' occurre

WXTEXTCRL在尝试删除或更改其值时会导致内存分配问题。下面是一些代码细节:

    wxTextCtrl* s = new wxTextCtrl(...);
    s->SetValue("abc");//crash
    delete s//crash
它的所有成员都是康斯特的。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
任何帮助都将不胜感激

以下是调用WXTEXTCRL的唯一函数的一些实际代码:

  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)//输入按钮处理程序
{
WXTEXTCRL*_t=(WXTEXTCRL*)此;
_清除();

*_t是否确实需要删除WXTEXTCRL?如果此文本控件放置在sizer中,则sizer将对此负责,并在需要时将其销毁。您可能需要将文本控件与sizer分离,然后将其删除。 您还应该使用方法,而不是
delete
运算符。这在文档中有明确的说明


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

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


而且你绝对不应该,永远不必像你在
OnEnter()中那样投出
this

@T_Rex我尝试将其从sizer中分离,但仍然发生崩溃。也尝试将其父级从sizer中分离,但仍然没有崩溃。此外,我实际上不需要删除WXTEXTCRL,但在尝试
WXTEXTCRL::SetValue(“”;
删除条目时也会发生相同的错误,因为
WXTEXTCRL::Clear()
不起作用。@T_Rex是的,我已经试过了。我正在windows 7上使用wxWidgets-2.9.5 Visual studio 2010。我还将编辑更多代码,希望能有所帮助。代码中的其他地方显然有一个bug,您必须理解调用
SetValue()
如果其他地方没有问题,则无法崩溃。但是,您没有告诉我们关于代码其余部分的任何信息,因此无法为您提供帮助。@VZ。在那里,我添加了一些代码。我正在使用IMPLEMENT_app宏实现该应用程序。其他一切都与往常一样…即使将此消息传递到Connect和其他许多随机尝试时也是如此继续崩溃。但是,我从版本2.9.5切换到了版本2.8,当我正确使用
Connect()
时,这个问题就消失了。谢谢。
   void AddButton::OnEnter(wxCommandEvent& event)//enter button handler
   {
       wxTextCtrl* _t = (wxTextCtrl*)this;
       _Clear();
       *_t<<"sup";
   }