親ウィンドウと子ウィンドウと孫ウィンドウがあるプログラムで、孫ウィンドウを何個作るかが未定なので「孫ウィンドウのウィンドウハンドルを受け取るHWNDをポインタにしておき、孫ウィンドウを作る直前でmallocで記憶領域を確保して孫ウィンドウを作り、プログラムを終了する際に孫ウィンドウを記憶していたポインタを開放する」という動作を期待して下記のようなソースを記述して実行をしたところ、プログラムを終了して孫ウィンドウのHWNDを開放する時に「HEAP CORRUPTION DETECTED:after Normal block(#64)at0x00134CD8.」と表示されたポップアップが出てきてしまいます。
HEAP CORRUPTION DETECTEDというのはmallocで確保した容量以上のものを記憶しようとした際に発生するエラーらしいですが、この記述の中で無茶だと思える記録を指示した覚えはありませんし、そのようなエラーが記憶する処理ではなく開放する処理を行う際に発生する理由が分かりません。
一体何が起こっていて、解決するにはどうしたらいいのでしょうか?どなたかよろしくお願いします。
#include <windows.h>
HWND hMainWnd;
HWND hCWnd;
HWND *phCCWnd;
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static CONST PSTR strKitty =
TEXT("再現テスト");
RECT recClient1;
RECT recClient2;
switch (msg) {
case WM_DESTROY:
free(phCCWnd);
PostQuitMessage(0);
return 0;
case WM_CREATE:
GetClientRect(hwnd,&recClient1);
hCWnd=CreateWindow(
TEXT("STATIC") , NULL ,
WS_CHILD | WS_VISIBLE | SS_CENTER ,
recClient1.left , recClient1.top , recClient1.right , recClient1.bottom ,
hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
GetClientRect(hCWnd,&recClient2);
phCCWnd = (HWND*)malloc(1);
*phCCWnd = CreateWindow(
TEXT("STATIC") , strKitty ,
WS_CHILD | WS_VISIBLE | SS_CENTER ,
recClient2.left , recClient2.top , recClient2.right , recClient2.bottom ,
hCWnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
return 0;
case WM_SYSCOMMAND:
DefWindowProc(hwnd,msg,wp,lp);
return 0;
case WM_SIZE:
GetClientRect(hwnd,&recClient1);
SetWindowPos(hCWnd,NULL,recClient1.left , recClient1.top , recClient1.right , recClient1.bottom ,SWP_NOZORDER);
return 0;
default:
return DefWindowProc(hwnd , msg , wp , lp);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow ) {
MSG msg;
WNDCLASSEX winc;
winc.cbSize = sizeof(WNDCLASSEX);
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = 0;
winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("MeinWindou");
winc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0, 0,
LR_DEFAULTSIZE|LR_SHARED);
if (!RegisterClassEx(&winc)) return -1;
hMainWnd = CreateWindow(
TEXT("MeinWindou") , TEXT("SubClassTest") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hMainWnd == NULL) return -1;
while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
return msg.wParam;
}