在0xccccc访问读取违规

时间:2012-01-08 05:21:26

标签: c++ winapi visual-c++ runtime-error

我不知道为什么会这样;一些谷歌搜索让我相信它是由于不正确的内存管理,而其他人则说这是因为链接到可执行文件的无效.DLL。我似乎无法解决这个问题,因为我能想到的唯一.DLL是无效的。我的freeglut .DLL,但它本身没有任何问题。

我要做的就是创建一个窗口。

问题

我的代码发生了什么?我做错了什么,我该如何解决?

代码

WinMain

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
LPSTR lpszCmdLine, int nCmdShow) {

    WNDCLASSEX wc;
    HWND hwnd;
    MSG     msg;
    bool    done;

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc.lpszClassName = L"someclass";

    if (!RegisterClassEx(&wc)) { //Error: 
        MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
        return 0;
    }

    hwnd = CreateWindow(
        L"someclass", L"someclass", 
        WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_SYSMENU,
        200, 200, 400, 400, NULL, NULL, hInstance, NULL
        );

    if (!hwnd) {
        MessageBox(NULL, L"Window Creation Failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
    }

    done = false;

    while(!done) {
        PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

        if (msg.message == WM_QUIT) { 
            done = true;
        } else {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return msg.wParam;

}

stdafx.h < - 预编译标题

#ifndef STDAFX_H
#define STDAFX_H

#include <Windows.h>
#include <WinUser.h>
#include <GL\freeglut.h>

#endif

WndProc

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    PAINTSTRUCT paintstruct;
    HDC hdc;
    LPCWSTR str = L"Hello, World!";

    switch(message) {
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &paintstruct);
        SetTextColor(hdc, COLORREF(0x00FF0000));
        TextOut(hdc, 200, 200, str, sizeof(str) - 1);
        EndPaint(hwnd, &paintstruct);
        return 0;
        break;

    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;

    case WM_CREATE:
        return 0;   
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

官方错误

Access violation reading location 0xcccccccc.

更新

//Error语句中RegisterClassEx标记if注释的位置是错误发生的位置。

2 个答案:

答案 0 :(得分:5)

0xCCCCCCCC是一个神奇的数字,由Microsoft的C ++调试运行时库使用,用于标记未初始化的堆栈内存。您没有指明您遇到此错误的哪一行,这使得很难确切地说明哪个变量未初始化。

其他magic numbers from this series包括:

  • 0xABABABAB Microsoft的HeapAlloc()用于在分配堆内存后标记“无人区”保护字节
  • 0xBAADF00D由Microsoft LocalAlloc(LMEM_FIXED)用于标记未初始化的已分配堆内存
  • 0xCDCDCDCD由Microsoft的C ++调试运行时库用于标记未初始化的堆内存
  • 0xDDDDDDDD由MicroQuill的SmartHeap和Microsoft的C ++调试堆用于标记释放的堆内存
  • 0xDEADDEAD用户手动启动崩溃时使用的Microsoft Windows STOP错误代码。
  • 0xFDFDFDFD Microsoft的C ++调试堆用于在分配的堆内存之前和之后标记“无人区”保护字节
  • 0xFEEEFEEE由Microsoft HeapFree()用于标记已释放的堆内存

答案 1 :(得分:4)

您尚未初始化wchIconSmlpszMenuName)的所有数据成员。在开始使用之前,您应该对wc进行零初始化。例如:

WNDCLASSEX wc((WNDCLASSEX()));

0xcc是填充字符,调试运行时在输入函数之前初始化堆栈。当您看到此值(并且不期望该值)时,这意味着您正在使用未能初始化的变量。