使用CreateWindowExW时堆积损坏

时间:2014-02-27 15:23:40

标签: c++ visual-studio-2010 heap-corruption

我在堆损坏方面遇到了一些问题。使用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返回一个非零值,并且应该创建窗口...

2 个答案:

答案 0 :(得分:4)

如上所述,在您的进程中加载​​的某些DLL /模块已经发生实际损坏之后,通常会检测到堆损坏。从你的帖子看起来这个问题是特定于Windows平台的,所以我建议你使用WinDBG / Pageheap并找出实际内存损坏发生的地方。关于堆内存损坏分析的一篇非常好的文章可以在“高级Windows调试,作者:作者:Mario Hewardt; Daniel Pravat”第06章

一书中找到。

http://advancedwindowsdebugging.com/ch06.pdf

答案 1 :(得分:-2)

更改

WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };

WNDCLASSEX wcex = { 0 };

您正在将WNDCLASSEX的指针成员初始化为非null(但是无意义的值,即sizeof(WNDCLASSEX))。