0

これまではうまく機能していた単純な (単一のダイアログ) wxWidgets アプリケーションがありますがwxTextCtrl、ダイアログに a を追加して以来、プログラムが終了するたびに segfault が発生します。

samples/textプログラムには多くのテキスト コントロールが含まれており、正常に動作するため、私が見逃している明らかなバグがあるに違いないと推測しています。

この問題は、 を削除するときwxTextCtrl、つまり通常はプログラムを終了するときにのみ発生します (したがって、理論的にはexit、クリーンアップせずに終了することで回避できますが、実際にはそうしたくありません)。テキスト コントロールに属する a に属するwxColoura 。wxTextAttr

また、mingw32 用にコンパイルした場合にのみ発生します。MSVC およびすべての 64 ビット ビルドは影響を受けません。

wxWidgets のバージョンは 2.8.12 です。2.9.x はまだ試していません。

問題を説明する最小限のプログラムを次に示します。メイン ウィンドウを埋める 1 つの複数行テキスト コントロールを作成するだけです。

#include "wx/wx.h"

enum
{
    Minimal_Quit = wxID_EXIT,
};

class MyApp : public wxApp
{
public:
    MyApp() {}
    virtual bool OnInit();
    virtual int OnExit();

private:
    DECLARE_EVENT_TABLE()
};


class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString &title);
    virtual ~MyFrame();
    void OnQuit(wxCommandEvent &event);

private:
    DECLARE_EVENT_TABLE()
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(Minimal_Quit,  MyFrame::OnQuit)
END_EVENT_TABLE()

bool MyApp::OnInit()
{
    if (! wxApp::OnInit()) return false;
    MyFrame *frame = new MyFrame(_T("Test"));
    frame->Show(true);
    return true;
}

int MyApp::OnExit()
{
    return 0;
}

IMPLEMENT_APP(MyApp)

BEGIN_EVENT_TABLE(MyApp, wxApp)
END_EVENT_TABLE()

MyFrame::MyFrame(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title)
{
  wxBoxSizer *sizermain = new wxBoxSizer(wxVERTICAL);
  sizermain->SetMinSize(640, 400);
  wxTextCtrl *textCtrl =
    new wxTextCtrl(this, wxID_ANY, _T("Hello, world"), wxDefaultPosition, wxDefa
ultSize, wxTE_MULTILINE);
  sizermain->Add(textCtrl, 1, wxALL | wxEXPAND);
  this->SetSizer(sizermain);
  sizermain->SetSizeHints(this);
}

MyFrame::~MyFrame()
{
}

void MyFrame::OnQuit(wxCommandEvent &WXUNUSED(event))
{
    Close(true);
}

スタック トレースは次のとおりです。

Program received signal SIGSEGV, Segmentation fault.
0x6338155c in wxObject::UnRef (this=0x755d37c) at ./src/common/object.cpp:348
348             if ( --m_refData->m_count == 0 )
(gdb) where
#0  0x6338155c in wxObject::UnRef (this=0x755d37c)
    at ./src/common/object.cpp:348
#1  0x006602a3 in wxObject::~wxObject (this=0x755d37c,
    __in_chrg=<optimized out>) at ./include/wx/object.h:413
#2  0x00638d34 in wxGDIObject::~wxGDIObject (this=0x755d37c,
    __in_chrg=<optimized out>) at ./include/wx/gdiobj.h:29
#3  0x0063bc60 in wxColourBase::~wxColourBase (this=0x755d37c,
    __in_chrg=<optimized out>) at ./include/wx/colour.h:64
#4  0x0049c094 in wxColour::~wxColour (this=0x755d37c,
    __in_chrg=<optimized out>) at ./src/msw/colour.cpp:77
#5  0x0063784d in wxTextAttr::~wxTextAttr (this=0x755d364,
    __in_chrg=<optimized out>) at ./include/wx/textctrl.h:189
#6  0x006456be in wxTextCtrlBase::~wxTextCtrlBase (this=0x755d210,
    __in_chrg=<optimized out>) at ./include/wx/textctrl.h:295
#7  0x0050f8ef in wxTextCtrl::~wxTextCtrl (this=0x755d210,
    __in_chrg=<optimized out>) at ./src/msw/textctrl.cpp:290
#8  0x0050f937 in wxTextCtrl::~wxTextCtrl (this=0x755d210,
    __in_chrg=<optimized out>) at ./src/msw/textctrl.cpp:293
#9  0x005888cf in wxWindowBase::DestroyChildren (this=0x755c878)
    at ./src/common/wincmn.cpp:447
#10 0x004c311a in wxWindow::~wxWindow (this=0x755c878,
    __in_chrg=<optimized out>) at ./src/msw/window.cpp:561
#11 0x00583e0b in wxTopLevelWindowBase::~wxTopLevelWindowBase (
    this=0x755c878, __in_chrg=<optimized out>) at ./src/common/toplvcmn.cpp:62
#12 0x004bf18b in wxTopLevelWindowMSW::~wxTopLevelWindowMSW (this=0x755c878,
    __in_chrg=<optimized out>) at ./src/msw/toplevel.cpp:618
#13 0x0064be2c in wxTopLevelWindow::~wxTopLevelWindow (this=0x755c878,
    __in_chrg=<optimized out>) at ./include/wx/toplevel.h:352
#14 0x005434ed in wxFrameBase::~wxFrameBase (this=0x755c878,
    __in_chrg=<optimized out>) at ./src/common/framecmn.cpp:76
#15 0x004e9bc5 in wxFrame::~wxFrame (this=0x755c878,
    __in_chrg=<optimized out>) at ./src/msw/frame.cpp:210
#16 0x00401730 in MyFrame::~MyFrame (this=0x755c878,
    __in_chrg=<optimized out>) at MainFrame.cpp:63
#17 0x0040175d in MyFrame::~MyFrame (this=0x755c878,
    __in_chrg=<optimized out>) at MainFrame.cpp:65
#18 0x0051fabf in wxAppBase::DeletePendingObjects (this=0x7551240)
    at ./src/common/appcmn.cpp:423
#19 0x0051fc09 in wxAppBase::ProcessIdle (this=0x7551240)
    at ./src/common/appcmn.cpp:454
#20 0x0053dbe0 in wxEventLoopManual::Run (this=0x755e1b0)
    at ./src/common/evtloopcmn.cpp:99
#21 0x0051f7f7 in wxAppBase::MainLoop (this=0x7551240)
    at ./src/common/appcmn.cpp:312
#22 0x0051f92d in wxAppBase::OnRun (this=0x7551240)
    at ./src/common/appcmn.cpp:367
#23 0x633709fc in wxEntryReal (argc=@0x22fe5c: 1, argv=0x3e81b8)
    at ./src/common/init.cpp:448
#24 0x633c09bc in wxEntry (argc=@0x22fe5c: 1, argv=0x3e81b8)
    at ./src/msw/main.cpp:231
#25 0x004951f3 in wxEntry (hInstance=0x400000, nCmdShow=10)
    at ./src/msw/main.cpp:386
#26 0x0040150c in WinMain@16 (hInstance=0x400000, hPrevInstance=0x0,
    lpCmdLine=0x241f19 "", nCmdShow=10) at MainFrame.cpp:48
#27 0x00403cdb in main ()
4

1 に答える 1

2

コードは完全に正しく、間違いなく (wxWidgets のどのバージョンでも) 動作するので、私が見る唯一の説明は、何らかのミスコンパイルの問題があるということです。つまり、ライブラリのビルド時に使用されたものとは異なるヘッダーに対してアプリケーションをコンパイルしたか、異なる (そして互換性のない) コンパイラ オプションを使用します。この種の問題に対処する最も簡単な方法は、すべてを削除して再構築することです。また、システムにヘッダー/ライブラリのセットが 1 つしかないことを確認してください。

于 2013-11-05T23:54:18.173 に答える