C++ DirectX 无法读取内存

标签 c++ directx

我有一个包含所有 D3D 窗口函数的类:

class cD3DWindow
{
public:
    cD3DWindow();
    ~cD3DWindow();

    void initD3D(HWND hWnd);
    void render_frame(void);
    void cleanD3D(void);
private:
    LPDIRECT3D9 d3d;
    LPDIRECT3DDEVICE9 d3ddev;
};

我是这样使用它的:

void cD3DWindow::initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;
    d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
    D3DXCreateFont(d3ddev, 20, 0, FW_EXTRABOLD, 1, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &pFont);
}

但是当我调试我的程序时,它给了我以下错误: https://gyazo.com/cb82a94606b2b3c1a49c55b03060d941

它编译没有任何错误,但是当我尝试启动程序时它崩溃了。 如果我删除以下内容,该程序将运行:

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;

并将其粘贴到 Main.cpp 中程序启动而不会崩溃。

知道什么可能导致错误吗?

最佳答案

在您发布的那张图片上,您的“this”指针为 NULL。这意味着您没有初始化您的 cD3DWindow 实例。但是你是从空指针调用它的。它正在崩溃,因为 d3d 和 d3ddev 位于“this”指针的内存位置,该指针为零。如果你把这两个变量放在你的 main.cpp(全局变量)中,突然间它们有一个合适的内存位置,因为你不使用“this”指针它不会崩溃。

非虚类方法只是常规函数,使用“this”指针作为“拥有”该方法的实例调用。如果您使用“损坏的 this”指针(如 null)调用方法,那么您将无法访问该类中的字段,否则它将运行而不会崩溃。

关于C++ DirectX 无法读取内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34314742/

相关文章:

c++ - 在 Dev C++ 中将控制台设置为最大化

c++ - 对相邻的数组元素使用共享内存?

c++ - cassandra cpp 驱动程序 dev 2.9.0-1 无法安装在 Debian Stretch 上?

c++ - 设计一个重新散列函数......如何避免相同的散列?

opengl - 从 OpenGL/DirectX 程序员的角度来看, "GPU Cache"是什么?

c++ - 在 Direct3D (DirectX) 应用程序中禁用 alt-enter

c++ - for循环中指针的段错误

directx - 能否将 DirectX 游戏移植到 Google Native Client?

c++ - "D3DX11CreateShaderResourceViewFromFile"让它工作或寻找替代品

directx - 使用 Direct3D 绘制带有圆角末端的线条