程序工作正常(随机崩溃)和内存验证器报告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
答案 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
如果编译器抱怨,请检查它所引用的代码。
更新:当然,此问题可能适用于您的所有其他类。请阅读“三个法则”。