【问题标题】:Memory accessibility内存可访问性
【发布时间】:2018-12-27 19:03:56
【问题描述】:

首先,我正在学习 WIN32 atm。所以,我决定在网上找一些指南。我找到了一些关于它的文章,但是在第 4 篇文章中老师写了一些代码,发生了一个异常,它停止了进程并写道:“这一行称为断点”。这段代码使用了一些内存操作(GlobalAlloc、GlobalFree)和一些字体操作,我认为这可能会导致一些内存不足。我想,如果我要删除这段代码,我也会删除这个问题。但现在我的代码无法运行,这里总是发生一些错误,说:“在地址 0xcccccccc 访问 vilation”。此消息出现在 RegisterClassEx() 行,我不知道应该释放哪个内存区域。告诉我,伙计们,我该怎么办。我使用 VS17 和 Windows 10。这是我的代码,是手写的(不是必需的):

#include "stdafx.h"
#include <Windows.h>
LPCWSTR szClassName = L"defaultWindow";
LRESULT CALLBACK WindowProcedure(HWND hWindow, UINT message, WPARAM wParam, 
LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        MessageBoxW(hWindow, L"Hello!", L"Program", MB_OK | 
        MB_ICONINFORMATION);
        break;
    case WM_DESTROY:
        PostQuitMessage(NULL);
        break;
    default:
        return DefWindowProcW(hWindow, message, wParam, lParam);
    }
    return NULL;
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE pInstance, LPTSTR 
lpszCmdLine, int nCmdShow)
{
    WNDCLASSEX windowClass;
    windowClass.cbSize = sizeof(windowClass);
    windowClass.cbClsExtra = 0;
    windowClass.cbWndExtra = 0;
    windowClass.style = CS_VREDRAW | CS_HREDRAW;
    windowClass.hIcon = LoadIcon(hInstance, IDI_WINLOGO);
    windowClass.hCursor = LoadCursor(hInstance, IDC_ARROW);
    windowClass.hIconSm = LoadIcon(hInstance, IDI_WINLOGO);
    windowClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    windowClass.lpfnWndProc = WindowProcedure;
    windowClass.lpszClassName = szClassName;

    if (!RegisterClassEx(&windowClass))
    {
        MessageBoxW((HWND)NULL, L"Window class couldn't be registered!", 
         L"Error!", MB_OK | MB_ICONERROR);
         return NULL;
     }

     HWND hMainWindow = CreateWindowW(szClassName, L"Программа", 
     WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     (HWND)NULL,
        (HMENU)NULL, hInstance, (LPARAM)NULL);

    if (!hMainWindow)
    {
         MessageBoxW((HWND)NULL, L"Window couldn't be 
         created!",L"Error!",MB_OK | MB_ICONERROR);
         return NULL;
    }

    ShowWindow(hMainWindow, nCmdShow);
    UpdateWindow(hMainWindow);

    MSG message;

    while (GetMessageW(&message, hMainWindow, (UINT)NULL, (UINT)NULL))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
    return message.wParam;
}

各位帮忙,我不会编码

【问题讨论】:

  • 异常和断点是无关的东西。
  • 这似乎是learn how to debug your programs 的好时机。更具体地说,使用调试器捕捉崩溃在操作中 以定位它在代码中发生的时间和位置。然后您还可以检查所有相关变量的值。
  • 问题是,我没有放断点
  • 我使用了调试器,但我认为,问题已附加到某些系统文件或内存区域,因为重新启动 vs,计算机无法修复该问题,而我的代码没问题
  • 另外,请阅读this question checklist 和所有idownvotedbecau.se,了解您的问题可能被否决的一些原因。

标签: c++ windows winapi exception memory


【解决方案1】:

所以,我终于意识到,我忘了添加 lpszMenuName 和 hInstance。对不起,浪费时间xD

【讨论】:

    【解决方案2】:

    您永远不会初始化 windowClass.hInstance 或 windowClass.lpszMenuName ,因此它们有任何随机值碰巧占用内存。 如果换行:

    WNDCLASSEX windowClass;
    

    WNDCLASSEX windowClass {};
    

    这些成员将被零初始化。

    【讨论】:

    • 谢谢大佬,已经知道了,如果找不到,对我有很大帮助
    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2023-03-11
    相关资源
    最近更新 更多