-1

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のデフォルトのdestroyを試しても:

    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";
   }
4

2 に答える 2

1

本当にwxTextCtrlを削除する必要がありますか?このテキストコントロールがサイザーに配置されている場合、サイザーはそれを担当し、必要に応じて破棄します。おそらく、テキストコントロールをサイザーから切り離してから削除する必要があります。また、演算子の代わりにDestroy()メソッドを使用する必要があります。deleteこれはドキュメントで明確に説明されています。

通話時のクラッシュについてSetValue():使用しようとしましたwxT("abc")か?また、どのバージョンのwxWidgets、OS、コンパイラを使用していますか?wxWidgetsでこのような問題はまったく発生していません。たぶん、問題を特定するのに役立つ意味のあるコードを投稿できますか?

于 2013-03-17T22:47:33.243 に答える
1

の理解に問題があると思いますConnect()。別のオブジェクトのメソッドに接続するためにそれを使用している場合は、最後の引数としてこのオブジェクトへのポインターを渡す必要があります(ドキュメントeventSinkで呼び出されます)。あなたのメソッドはほぼ間違いなく間違ったオブジェクトポインタで呼び出されています。

thisそして、絶対に絶対に絶対にしないでください。で行うようにキャストする必要はありませんOnEnter()

于 2013-03-18T00:21:33.753 に答える