- 2012-2-15
- Visual C++
だいぶ古い記事
最近知ったのですが、 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 と同様、メモリリークを自動検出
してくれない。