2013-03-17 50 views
-1

當試圖刪除或更改其值時,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

回答

1

我覺得您在理解Connect()時遇到問題。如果您使用它連接到不同對象的方法,則您必須必須將作爲最後一個參數(在the documentation中稱爲eventSink)傳遞此對象的指針。你的方法幾乎肯定會被錯誤的對象指針調用。

而且你應該絕對不會像OnEnter()那樣必須鑄造this

+0

即使將此傳遞給Connect以及其他許多隨機嘗試,它仍會繼續崩潰。但是,我從版本2.9.5切換到2.8,並且當我以正確的方式使用Connect()時,這個問題已經消失。謝謝。 – 2013-03-18 22:51:37

1

你確定你真的需要刪除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