初歩的な質問で申し訳ないですが、「猫さん」のページで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;
CMyWindow::~CMyWindow()
{
delete pMyStatic1;
delete pMyStatic2;
//CFrameWnd::~CFrameWnd(); <--- ここのコメントをはずすと実行終了時にエラーになりコメントつけるとエラーにならなくなります。
}
この場合はCFrameWnd::~CFrameWnd(); を実行しちゃうとCFrameWndがさきに崩壊してCMyWindowがおかしくなりそうな感じもするのですがどうでしょうか。
明示的に呼ぶとデストラクタが二度呼ばれます。
ぶっ飛ぶのも無理ありません。
επιστημηさん。ありがとうございます。
編集 削除解決わすれました。
編集 削除