Нарушение прав доступа на 0xccccc - PullRequest
0 голосов
/ 08 января 2012

Понятия не имею, почему это происходит;некоторые поиски в Google привели меня к мысли, что это из-за неправильного управления памятью, в то время как другие заявили, что это из-за недопустимого .DLL, связанного с исполняемым файлом.Кажется, я не могу понять это, потому что единственный .DLL, о котором я могу думать как о недействительном, - это мой свободный глоток .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 <- <strong>предварительно скомпилированный заголовок

#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 ]

5 голосов
/ 08 января 2012

0xCCCCCCCC - это магическое число, используемое библиотекой времени выполнения отладки C ++ от Microsoft для обозначения неинициализированной стековой памяти. Вы не указываете, по какой строке вы получаете эту ошибку, из-за чего трудно точно сказать, какая переменная неинициализирована.

Другие магические числа из этой серии включают в себя:

  • 0xABABABAB Используется Microsoft HeapAlloc() для пометки защитных байтов "ничейной земли" после выделенной памяти кучи
  • 0xBAADF00D Используется Microsoft LocalAlloc(LMEM_FIXED) для маркировки неинициализированной выделенной памяти кучи
  • 0xCDCDCDCD Используется библиотекой времени выполнения отладки C ++ от Microsoft для пометки неинициализированной памяти кучи
  • 0xDDDDDDDD Используется MicroHuill's SmartHeap и Microsoft C ++ для отладки кучи для обозначения свободной памяти кучи
  • 0xDEADDEAD Код ошибки Microsoft Windows STOP, используемый, когда пользователь вручную запускает сбой.
  • 0xFDFDFDFD Используется в отладочной куче Microsoft C ++ для пометки защитных байтов «без земли» до и после выделенной памяти кучи
  • 0xFEEEFEEE Используется Microsoft HeapFree() для отметки свободной памяти кучи
4 голосов
/ 08 января 2012

Вы не инициализировали все элементы данных wc (hIconSm и lpszMenuName).Вам следует инициализировать wc нулями, прежде чем начать его использовать.Например:

WNDCLASSEX wc((WNDCLASSEX()));

0xcc - это символ заполнения, с помощью которого среда выполнения отладки инициализирует стек перед вводом вашей функции.Когда вы видите это значение (а это значение не ожидается), это означает, что вы используете переменную, которую не удалось инициализировать.

...