Editコントロールのメモリ使用量

[戻る]
YY 2008/10/03(金) 15:50:23
vc++2005 MFC Dialogベースで新規アプリを作成し、
最初にあるコントロールを全て削除して、
ダイアログにEditコントロールを作る。
これを、メンバ変数 CEdit m_Edit; として追加。

また、PreTranslateMessageを追加し、以下の処理にする。
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN)
    {
        switch(pMsg->wParam)
        {
        case VK_RETURN:
            m_EnterKeyCount++; // .hにて定義したint型
(OnInitDialogで=0している)
            if(m_EnterKeyCount == 1)
            {
                // Editの内容をクリアする
                m_Edit.SetWindowTextA(_T(""));
                m_EnterKeyCount = 0;
            }
            return TRUE;
        }
    }
    return CDialog::PreTranslateMessage(pMsg);
}

この状態でEditボックスに文字を入れていくと、
タスクマネージャで確認するとメモリ使用量が増える一方になっています。
増え続けてしまうのは何故なのでしょうか?

また、解決策として使った分のメモリを開放するには
どうしたらいいのか教えてください。よろしくお願いします。

仲澤@失業者 2008/10/03(金) 16:44:20
> タスクマネージャで確認するとメモリ使用量が増える一方になっています。
> 増え続けてしまうのは何故なのでしょうか?

これに「正確に」答えられる人はいないでしょう。
以下は憶測です。
 エディットボックスは事実上無限回のUndo機能を持っています。
 Undo機能を実現するには行ったことを全て記憶しておかなければ
 なりません。このUndoのための情報は、文字の削除でも入力でも
 常に増加していきます。従って、操作をすればするほどメモリーを
 消費することになります。

> また、解決策として使った分のメモリを開放するには
> どうしたらいいのか教えてください。よろしくお願いします。

自分が確保したのでないメモリーを解放してはいけません。
つまり、ご指摘の現象に如何なる対策もしてはいけません。
(する方法もありません)

仲澤@失業者 2008/10/03(金) 16:58:01
間違い修正。
「標準」エディットボックスのUndoは1回ですね。
リッチと間違えました。

ITO 2008/10/04(土) 13:26:52
>m_EnterKeyCount++;
せっかく m_EnterKeyCount++;しているなら
ココカラ-------------------------
            if(m_EnterKeyCount == 1)
            {
                // Editの内容をクリアする
                m_Edit.SetWindowTextA(_T(""));
                m_EnterKeyCount = 0;
            }
ココマデ----------------------------
の処理をタイマ-ルーチンに入れたほうがいいと思います。

PreTranslateMessage(MSG* pMsg)
等のルーチンではあまり処理をしないほうがいいです。
>            if(m_EnterKeyCount == 1)
            if(m_EnterKeyCount > 0)
のほうがいいですね。

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