[英]wxWidgets wxTextCtrl crash when deleting
当尝试删除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";
}
确定要删除wxTextCtrl吗? 如果将此文本控件放入sizer,则sizer对此负责,并将在需要时销毁它。 您可能需要从sizer分离文本控件,然后将其删除。 另外,您应该使用Destroy()方法而不是delete
运算符。 这在文档中有明确说明。
至于对SetValue()
调用的崩溃:您是否尝试过使用wxT("abc")
? 您还使用什么版本的wxWidgets,OS和编译器? 完全没有遇到过wxWidgets这样的问题。 也许您可以发布一些有意义的代码来帮助发现问题?
我认为您对Connect()
理解存在问题。 如果使用它连接到另一个对象的方法,则必须将指向该对象的指针作为最后一个参数(在文档中称为eventSink
) eventSink
。 几乎可以肯定,您的方法是在错误的对象指针上调用的。
你应该绝对不会,永远要投this
就像你在做OnEnter()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.