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";
}
我觉得您在理解Connect()
时遇到问题。如果您使用它连接到不同对象的方法,则您必须必须将作为最后一个参数(在the documentation中称为eventSink
)传递此对象的指针。你的方法几乎肯定会被错误的对象指针调用。
而且你应该绝对不会像OnEnter()
那样必须铸造this
。
即使将此传递给Connect以及其他许多随机尝试,它仍会继续崩溃。但是,我从版本2.9.5切换到2.8,并且当我以正确的方式使用Connect()时,这个问题已经消失。谢谢。 – 2013-03-18 22:51:37
你确定你真的需要删除wxTextCtrl?如果将此文本控件放入sizer中,则sizer负责对其进行处理,并在需要时将其销毁。您可能需要从sizer分离文本控件,然后将其删除。 也应该使用Destroy()方法而不是delete
运算符。这在文档中有明确的解释。
至于碰撞SetValue()
电话:你有没有试过用wxT("abc")
?你使用的是什么版本的wxWidgets,操作系统和编译器?完全没有遇到wxWidgets的这些问题。也许你可以发布一些有意义的代码来帮助识别问题?
@T_Rex我试图从sizer分离它仍然崩溃。也尝试从sizer中分离它的父项,但没有任何项目仍然崩溃。另外,我并不需要删除wxTextCtrl,但是当我尝试'wxTextCtrl :: SetValue(“”);'因为'wxTextCtrl :: Clear()'不起作用而删除条目时会发生同样的错误。 – 2013-03-17 22:58:20
@T_Rex是的,我已经尝试过。我在Windows 7上使用了wxWidgets-2.9.5 Visual Studio 2010.另外,我将在编辑中加入更多代码,希望对您有所帮助。 – 2013-03-17 23:18:36
@T_Rex在这里它是 – 2013-03-17 23:24:31
在你的代码的其他地方显然存在一个错误,你必须明白,调用'SetValue()'不会崩溃,如果没有其他地方没有错。但是你不会告诉我们关于你的其他代码的任何信息,因此无法帮助你。 – 2013-03-17 23:13:22
@VZ。在那里我添加了更多的代码。我正在使用IMPLEMENT_APP宏实现该应用程序。其他一切都像往常一样,因为它可以是... – 2013-03-17 23:25:27