メモリ動的確保

  • デル株式会社
  • だいぶ古い記事

    最近知ったのですが、 new と delete って、VC++ では
    MFC のメモリ管理機能のデバッグ バージョン
    とやらを使っているらしい。
    なので、コンパイルオプションで『MFCを使用しない』ってすると、
    嫌がらせみたいなエラーが出てくる。
    ちなみに、ANSI C++ では、 stdio.h をインクルードすれば
    new と delete を使えるようだ。
    今日は、MFCも使わず、Cネイティブなmallocやfreeってコーディングも
    嫌だって人の為の話しです。
     

    使用例

    #include <windows.h>



        //MFCを使用せずメモリを動的確保する
        HGLOBAL hGMem;
        char* pTest;
        hGMem = GlobalAlloc( GHND , 20 );    //メモリ確保 [GHND]はメモリ確保+初期化
        pTest = (char*)GlobalLock( hGMem );
        //↓なやり方もできるが、可読性が著しく落ちるのでやめる
        //pTest = (char*)GlobalLock(hGMem = GlobalAlloc( GHND , 20 ));    //メモリ確保
        GlobalFree( hGMem );//GlobalFreeする為には、HGLOBAL の中身を取っておかないとダメ。

    GlobalAllocの第一引数に何を使えばいいかは詳しく調べてないが、なんとなく
    GHND(GMEM_MOVEABLE | GMEM_ZEROINIT) が最適そうな臭いがする。
    GMEM_FIXEDを使用すればいちいちGlobalLockをやらなくても済みそうな感じがするが
    『固定メモリを確保します』と言うからには、アドレスずらせなさそうな臭いが
    するので止めた方がよさそう。(未確認:近いうちに調べよう・・・)

    ただし、注意が必要で、このAPIは malloc と同様、メモリリークを自動検出
    してくれない。

    関連記事

    ページ上部へ戻る