我在堆损坏方面遇到了一些问题。使用CreateWindowExW函数时可以观察到警告。我知道这通常是一个内存错误,但我怎么能在这种情况下搜索它?在调用CreateWindowExW之前没有新变量,我无法进入此函数。这是代码。
HWND GetMainWnd(HINSTANCE hInstance){
static HWND hWnd = NULL;
if (hWnd)
return hWnd;
RETURN_AT_ERROR(hInstance, NULL);
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = MainWndProc;
wcex.hInstance = hInstance;
wcex.hCursor = ::LoadCursorW(NULL, IDC_ARROW);
wcex.lpszClassName = g_config->GetWndClass();
ATOM atom = ::RegisterClassExW(&wcex);
RETURN_AT_ERROR(atom != 0, NULL);
hWnd = ::CreateWindowExW(WS_EX_LEFT, g_config->GetWndClass(), 0, WS_POPUP | WS_MINIMIZEBOX | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, hInstance, 0);
return hWnd;}
在此字符串
上hWnd = ::CreateWindowExW(WS_EX_LEFT, g_config->GetWndClass(), 0, WS_POPUP | WS_MINIMIZEBOX | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, hInstance, 0);
有一个警告消息框
Windows在drm.exe中触发了断点。这可能是由于a 堆的损坏,这表示drm.exe或任何一个中的错误 它已加载的DLL。这也可能是由于用户按下F12 虽然drm.exe有焦点。输出窗口可能有更多诊断 信息。
我按“继续”并显示
Unhandled exception at 0x77dae753 in app.exe: 0xC0000374: A heap has been corrupted.
然而,CreateWindowExW返回一个非零值,并且应该创建窗口...
答案 0 :(得分:4)
如上所述,在您的进程中加载的某些DLL /模块已经发生实际损坏之后,通常会检测到堆损坏。从你的帖子看起来这个问题是特定于Windows平台的,所以我建议你使用WinDBG / Pageheap并找出实际内存损坏发生的地方。关于堆内存损坏分析的一篇非常好的文章可以在“高级Windows调试,作者:作者:Mario Hewardt; Daniel Pravat”第06章
一书中找到。答案 1 :(得分:-2)
更改
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
到
WNDCLASSEX wcex = { 0 };
您正在将WNDCLASSEX的指针成员初始化为非null(但是无意义的值,即sizeof(WNDCLASSEX))。