<MFC>OnInitDialogですでにメモリリーク

[戻る]
DirtRunner [E-Mail] 2008/10/14(火) 19:41:04
WinXP SP3 VS2005 SP1
MFC ダイアログベースのアプリケーション

大型の装置を動かすためのアプリケーションを開発しています。
MFCのダイアログベースで、数個のボタン、MS FlexGrid 6.0のActiveXが3個、
そのほかEditBox、ListBox、ComboBoxなどが配置されています。

いつから発生したのか記憶が定かではないのですが、アプリ実行時に
「Detected Memory Leaks!!」がデバッグ出力表示されるようになってしまいました。

プログラムを起動してすぐにexit(0);で終了させても発生するので、
どこで発生しているのかを調べるため、あちこちにexit(0);を配置しました。


MyAppDlg.cppの中に、自動生成された
CMyAppDlg::CMyAppDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMyAppDlg::IDD, pParent)
    , m_Box1Val(0)
     :
     :  (ここにメンバ変数の初期化が並んでいます)
     :
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    ●ここでexit(0);
}

ここでexitしてもメモリリークは発生しません。
<MyApp.cpp>
INT_PTR nResponse = dlg.DoModal();
このDoModalの直前でも発生しません。 しかし、

<MyAppDlg.cpp>
BOOL CMyAppDlg::OnInitDialog()
{
    ●ここでexit(0);
    CDialog::OnInitDialog();
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
      :
      :

ここでexitすると、その瞬間にDetected Memory Leaks...が表示されます。
表示されるパスはMFCのライブラリ?で
occcont.cppやoccmgr.cppなどで、非常にたくさん表示されますが、
MyAppのソースコードがらみのものはありません。

DoModal()の中をステップで追いかけたのですが、何をやっているのかちっともわかりま
せんでした。


これは一体どこで発生しているメモリリークなのでしょうか?

ちなみにstdafx.hでは自分で追加した部分は
#define AAA_VAL 12345
のようなマクロのみで、ソースの中ではnewやdeleteはいくつか使用していますが、
OnInitDialogの手前で通るような部分ではなさそうです。
dllを使用していますが、dllそのものは別に委託して作ってもらったものです。
dllを使用(初期化)するための関数はOnInitDialogの10数行下にあり、当然通る前で
す。

ためしに新しくMFCのダイアログアプリを作って、適当にボタンを配置したりdllを使用し
たり、
どこでexit(0)を入れても上記のようなリークは発生しませんでした。

よろしくお願いします。

tetrapod 2008/10/14(火) 20:00:17
やってることがナンセンス

int main() {
    void* p=malloc(1000);
    free(p);
    return 0;
}
というメモリリークしていないまったく正しいプログラムがあったとして
malloc() の後 free() の前に exit() を入れたらどうなるか、わかって言ってる?
同じこと。

あとこのメモリリーク報告は誤解を招く可能性があって、たとえば
http://m--takahashi.com/bbs/pastlog/10700/10606.html

DirtRunner [E-Mail] 2008/10/14(火) 21:49:30
[[解決]]
解決しました。

どうやらdll側に問題があり、それと問題がごっちゃになっていたようで
メモリリークの表示の違いに気づいていなかったのがいけなかったようです。

ありがとうございました。

古いスレッドには追加発言できません。