メモリリークについて

[戻る]
けい 2004/12/05(日) 22:34:25
WinXP Pro / VC++7でMFCを使っていて質問です。
画像を処理するソフトを作っていまして、ボタンを押すと
保存結果をプレビューする機能を作ろうとしています。
すでに処理された画像があるバッファをプレビュー用のバッファにコピーして
別のピクチャボックスに描画しようとしているのですが…


ViewクラスのOnBnClickedPvButton()で、プレビュー用のバッファ
をnewで確保しているのですが、プログラム終了時に確保した分?メモリリークします。
処理自体はきちんとされていて、プレビューボタンを押した回数分メモリリークといわれ
ます。


以下にソースを抜粋します。ちなみにソース中の変数は
int bufsize…コピーする画像用のバッファサイズ
Byte *m_buf…処理された画像が入っているバッファ。このボタンが押すまでに確保され
てデータは入っている
Byte *m_pvbuf…プレビュー用のバッファ。ポインタはviewクラスで定義。ここでメモリ
を確保して開放もしたつもりなのに(T_T)

void CJpegView::OnBnClickedPvButton()
{
    // m_pvbuf : プレビュー用バッファ
    if (m_pvbuf!=NULL) {
        delete [] m_pvbuf;
        m_pvbuf=NULL;
    }

    //バッファコピー
    m_pvbuf = (BYTE *) new BYTE[bufsize];//メモリリークはこの行がエラーと
言う

    memcpy(m_pvbuf,m_buf,bufsize);

    //以下省略
}
CJpegView::~CJpegView()
{
    if (m_buf!=NULL) {
        delete [] m_buf;
        m_buf=NULL;
    }
    if (m_pvbuf!=NULL) {
        delete [] m_pvbuf;
        m_pvbuf=NULL;
    }

}


ちょっと長くなりましたが、
何か参考になることがございましたら教えていただきたいのでよろしくお願いします。

RAPT 2004/12/05(日) 22:42:02
CJpegViewのデストラクタはどこで作用していますか?

リーク検出時にCJpegViewのインスタンスが存在していれば、
m_pvbufは開放されていないので、リークしている、と検出
されるかと思われます。

けい 2004/12/06(月) 00:48:16
[[解決]]
お返事ありがとうございます。

>CJpegViewのデストラクタはどこで作用していますか?
現在SDIでFormViewで作っていますので
終了時に呼び出されていると思います。

プレビューボタン押した回数分メモリリークが多くなるので変だなと思ったら、
別のJpegを扱うライブラリと二重にメモリを確保していたようです。
そのため開放できないメモリができちゃったようです(>_<)

お騒がせしました。
回答していただいたRAPTさんありがとうございました。

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