0

こんにちは私はMFCでダイアログベースのアプリケーションを作成しています。

BOOL CClockMasterDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

m_ModeTabs.Create(this,WS_CHILD | WS_VISIBLE, 0);
}

を使用して作成した後に関数を破棄m_ModeTabsした場合:CClockMasterDlg::OnInitDialog

m_ModeTabs.DestroyWindow();

私はメモリを取得しませんが、それを配置するとリークが発生します。CClockMasterDlg::OnDestroy()メモリリークが発生します。それが呼び出されて返されるのは困難trueです。OnDestroy私はそれがOnInitDialog反対だとは思わないが、それではどの機能が正しいのだろうか?ありませんOnExitDialog

検出されたメモリリーク!オブジェクトのダンプ->{601}クライアントブロック0x00AEED48、サブタイプc0、212バイト長。CMFCVisualManager長さ212バイトの$00AEED48オブジェクトオブジェクトダンプが完了しました。プログラム[5312] ClockMaster.exe: Nativeはコード2(0x2)で終了しました。

ポインタではないので、タフなウィンドウでも自動的に破棄する必要があります。メモリリークが発生しないようにする必要がありますか?そして配置してから

m_ModeTabs.DestroyWindow();

作成された後のOnInitDialog関数でメモリリークが解決された後、それは本当に問題を引き起こしている他の何かではありませんか?また、Alsoを削除するとメモリリークが解決されるので、それが原因でm_ModeTabs.Create(...あると確信しています。m_ModeTabs

4

2 に答える 2

1

あなたは言わないと思いますが、m_ModeTabs は CClockMasterDlg の子ウィンドウであると想定しています。その場合、または同様の場合、DestroyWindow を明示的に呼び出す必要はありません。ウィンドウが Win32 によって Destroy() されると、その子ウィンドウもすべて破棄されます。

m_ModeTabs を (ポインタではなく) 通常の変数として宣言したため、それが所有するメモリは、CClockMasterDlg のデストラクタ中に C++ ランタイムによって自動的に解放されます。

于 2012-05-22T14:04:07.217 に答える
1

私は実際に、「Visual Studio の次のメジャー リリースの MFC で修正される」予定のバグにぶつかっています。

ダイアログのみの mfc アプリケーションで CVSListBox を使用すると、メモリ リークが発生します。

バグといくつかの回避策に関する情報は、次の場所にあります。

https://connect.microsoft.com/VisualStudio/feedback/details/646445/cvslistbox-produces-memory-leaks

http://connect.microsoft.com/VisualStudio/feedback/details/565327/memory-leaks-using-c

そして、ここでバグに関する別のレポート:

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/8870974f-1414-4dd7-b7c3-a1c320c0e91e

最初のリンクからの引用:

こんにちは、

ご報告ありがとうございます。この問題は、Visual Studio の次のメジャー リリースの MFC で修正されています。

Pat Brenner Visual C++ ライブラリ開発

于 2012-05-22T16:14:37.337 に答える