未初始化的读取问题

时间:2011-08-01 20:16:49

标签: c++

程序工作正常(随机崩溃)和内存验证器报告pD3D = Direct3DCreate9中未初始化的读取问题。 可能是什么问题?

init3D.h

    class CD3DWindow
    {
            public:
                CD3DWindow();
                ~CD3DWindow();
                LPDIRECT3D9 pD3D;
                HRESULT PreInitD3D();
                HWND hWnd;  
                bool killed;
                VOID KillD3DWindow();
    };

init3D.cpp

    CD3DWindow::CD3DWindow()
    {
        pD3D=NULL; 
    }

    CD3DWindow::~CD3DWindow()
    {
        if (!killed) KillD3DWindow();
    }

    HRESULT CD3DWindow::PreInitD3D()
    {
        pD3D = Direct3DCreate9( D3D_SDK_VERSION );  // Here it reports a problem 
        if( pD3D == NULL )  return E_FAIL;
    // Other not related code

    VOID CD3DWindow::KillD3DWindow()
    {
        if (killed) return;
        diwrap::input.UnCreate();   
        if (hWnd) DestroyWindow(hWnd);
        UnregisterClass( "D3D Window", wc.hInstance );
        killed = true;
    }

在主应用内.h

    CD3DWindow *d3dWin;

在主应用内.cpp

    d3dWin = new CD3DWindow;
d3dWin->PreInitD3D();

以下是错误报告:

 Error: UNINITIALIZED READ: reading register ebx
@0:00:02.969 in thread 4092

 0x7c912a1f <ntdll.dll+0x12a1f> ntdll.dll!RtlUnicodeToMultiByteN

0x7e42d4c4 <USER32.dll+0x1d4c4> USER32.dll!WCSToMBEx

0x7e428b79 <USER32.dll+0x18b79> USER32.dll!EnumDisplayDevicesA

0x4fdfc8c7 <d3d9.dll+0x2c8c7> d3d9.dll!DebugSetLevel

0x4fdfa701 <d3d9.dll+0x2a701> d3d9.dll!D3DPERF_GetStatus

0x4fdfafad <d3d9.dll+0x2afad> d3d9.dll!Direct3DCreate9

0x00644c59 <Temp.exe+0x244c59> Temp.exe!CD3DWindow::PreInitD3D
c:\_work\Temp\initd3d.cpp:32   

3 个答案:

答案 0 :(得分:2)

编辑:您的堆栈跟踪非常非常奇怪 - 在USER32.dll中?这是Windows的一部分。

我可能建议你将多字节Direct3D与Unicode D3D库或类似的东西连接起来。您不应该导致Windows功能触发错误。

答案 1 :(得分:0)

您的Memory Validator应用程序正在向您报告误报。我会忽略这个错误并继续前进。

答案 2 :(得分:0)

您的类CD3DWindow中没有复制构造函数。这可能不是原因,但这是我想到的第一件事。

如果代码中的任何地方,如果临时副本是由CD3DWindow实例构成的,那么该副本的析构函数将破坏窗口句柄。之后,您的原始版本将尝试使用相同的,现在无效的句柄。

对于赋值运算符也是如此。

如果内存没有被覆盖一段时间,这甚至可能会起作用。然后突然,内存被重用,你的代码崩溃了。

首先将此添加到您的班级:

private:
    CD3DWindow(const CD3DWindow&); // left unimplemented intentionally
    CD3DWindow& operator=(const CD3DWindow&); // left unimplemented intentionally

如果编译器抱怨,请检查它所引用的代码。

更新:当然,此问题可能适用于您的所有其他类。请阅读“三个法则”。