Что ж, нарушение доступа (0xC0000005
) означает, что вы получили доступ к памяти, которой у вас не должно быть.В этом случае говорится, что вы пытались написать на 0x0000000c
.Поскольку вы (ваш отладчик?) Говорите, что присвоение z
вызывает его, мы можем увидеть определение этого символа, пожалуйста?Кроме того, действительно ли это z = -14
или z -= 14
?
Редактировать: я думаю, вам нужно заменить ((CREATESTRUCT *)lParam)->lpCreateParams
действительным указателем на экземпляр class Window
.
Edit #2: Что происходит так: На WM_CREATE
вы устанавливаете GWLP_USERDATA
на значение, которое оказывается равным NULL
.Впоследствии вы читаете это значение и обрабатываете его как действительный указатель на Window
, вызывая нестатическую функцию-член для этого указателя.Функции-члены класса реализованы компилятором во многом так:
LRESULT CALLBACK <mangled_name ("Window::WndProc")> (Window * const this, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
// ...
}
По этой причине вы можете вызвать функцию-член по указателю NULL
.Однако, как только вы получаете доступ к переменной-члену, например z
, это нарушается.Компилятор вставил код, подобный этому *((int*) (this + 0xc)) = -14
, (что, кстати, означает, что z
лежит в вашем экземпляре Window
по 0xc байт), который с this == NULL
сломался.