デストラクタの異変?

解決


TUNE  2007-03-30 11:31:55  No: 64826

初歩的な質問で申し訳ないですが、「猫さん」のページでMFCをみていてデストラクタがどうも異変があるようなんですが、下記のようなプログラムの場合はデストラクタでデストラクタを呼ばないほうがいいんでしょうか。

どこのサイトではデストラクタでは仮想関数は呼ぶとダメって書いてあった気がするんですが。

#include <afxwin.h>
class CMyWindow : public CFrameWnd{
    CStatic *pMyStatic1;
    CStatic *pMyStatic2;
public:
    CMyWindow(); //コンストラクタ
    virtual ~CMyWindow();//デストラクタ
    afx_msg void OnPaint();
    afx_msg void OnLButtonDown(UINT, CPoint);
    afx_msg void OnRButtonDown(UINT, CPoint);
    DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyWindow, CFrameWnd)
    ON_WM_PAINT()
    ON_WM_LBUTTONDOWN()
    ON_WM_RBUTTONDOWN()
END_MESSAGE_MAP()

CMyWindow::CMyWindow()
{
    Create(NULL, "猫でもわかるテキスト表示");
    pMyStatic1 = new CStatic();
    pMyStatic1->Create("",
        WS_CHILD | WS_VISIBLE,
        CRect(20, 20, 40, 40),
        this);
    pMyStatic2 = new CStatic();
    pMyStatic2->Create("",
        WS_CHILD | WS_VISIBLE,
        CRect(20, 40, 40, 60),
        this);
}
CMyWindow::~CMyWindow()
{
    delete pMyStatic1;
    delete pMyStatic2;
    //CFrameWnd::~CFrameWnd();  <---  ここのコメントをはずすと実行終了時にエラーになりコメントつけるとエラーにならなくなります。
}

void CMyWindow::OnPaint()
{
    CPaintDC dc(this);
    CString str1 = "回  左クリックされました";
    CString str2 = "回  右クリックされました";
    dc.TextOut(40, 20, str1);
    dc.TextOut(40, 40, str2);
}

void CMyWindow::OnLButtonDown(UINT nFlags, CPoint pt)
{
    static int n = 1;
    char *szNum = "%d";
    char str[8];
    wsprintf(str, szNum, n++);
    pMyStatic1->SetWindowText(str);
}

void CMyWindow::OnRButtonDown(UINT nFlags, CPoint pt)
{
    static int n = 1;
    char *szNum = "%d";
    char str[8];
    ::wsprintf(str, szNum, n++);
    pMyStatic2->SetWindowText(str);
}
class CMyApp : public CWinApp{
public:
    virtual BOOL InitInstance(); 
};

BOOL CMyApp::InitInstance(){
  
    m_pMainWnd = new CMyWindow();      
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();        
    return TRUE;
}
CMyApp MyApp;


TUNE  2007-03-30 11:41:38  No: 64827

CMyWindow::~CMyWindow()
{
    delete pMyStatic1;
    delete pMyStatic2;
    //CFrameWnd::~CFrameWnd();  <---  ここのコメントをはずすと実行終了時にエラーになりコメントつけるとエラーにならなくなります。
}

この場合はCFrameWnd::~CFrameWnd(); を実行しちゃうとCFrameWndがさきに崩壊してCMyWindowがおかしくなりそうな感じもするのですがどうでしょうか。


επιστημη  URL  2007-03-30 15:05:09  No: 64828

明示的に呼ぶとデストラクタが二度呼ばれます。
ぶっ飛ぶのも無理ありません。


TUNE  2007-03-30 17:56:39  No: 64829

επιστημηさん。ありがとうございます。


TUNE  2007-03-30 17:57:20  No: 64830

解決わすれました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加