メモリ解放時のヒープコラプションについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
wasawasa
記事: 94
登録日時: 11年前

メモリ解放時のヒープコラプションについて

#1

投稿記事 by wasawasa » 11年前

こんにちは、何度もお世話になっております。
親ウィンドウと子ウィンドウと孫ウィンドウがあるプログラムで、孫ウィンドウを何個作るかが未定なので「孫ウィンドウのウィンドウハンドルを受け取る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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: メモリ解放時のヒープコラプションについて

#2

投稿記事 by みけCAT » 11年前

wasawasa さんが書きました:

コード:

phCCWnd = (HWND*)malloc(1);
さすがにHWND型のサイズが1バイトなわけはないと思うんですが…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: メモリ解放時のヒープコラプションについて

#3

投稿記事 by wasawasa » 11年前

すみません、見落としていました。
ヒープコラプションが出た場所が開放する処理を行う所だったのでそこしか見ていませんでした。
ご指摘頂いてありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る