我正在创建一个看起来像这样的 DirectX 11 辅助类:
#import "DXClass.h" // I have declared the constructor and the other methods here
// All of the DirectX libraries are imported in the header as well
DXClass::DXClass()
{
// Pointers created, etc.
}
DXClass:~DXClass()
{
// Other DirectX objects released
// With an if (bbSRView) {}, the exception still occurs, so bbSRView is not NULL
// bbSRView is a ID3D11ShaderResourceView*
// When the other violation does not occur, one does here:
bbSRView->Release();
bbSRView = NULL;
// More releases
void DXClass::Initialize()
{
SetupDisplay();
// Other initialization that works fine
}
void DXClass::SetupDisplay()
{
// This is where the debugger shows the access violation.
// factory is declared as DXGIFactory*
HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&factory);
// Loop through adapters and outputs, etc.
}
此类初始化如下:dxClass = new DXClass();
该Initialize()
函数在创建的类的另一个方法中调用dxClass
。
setupDisplay()
运行应用程序时,我在函数开始时遇到访问冲突。但是,如果我将代码放入setupDisplay()
并放入Initialize()
,删除对 的调用setupDisplay()
,则不会发生访问冲突。另外,如果我从中删除代码setupDisplay()
,使其成为一个空函数,然后在中调用它Initialize()
,则不会发生访问冲突。
似乎没有指针为 NULL,如果按上述方式更改,应用程序将正常启动。但是,另一方面,应用程序在退出时会收到另一个访问冲突。调试器指向Release()
对 an 的调用ID3D11ShaderResourceView*
,我在代码片段中已经指出了这一点。该指针似乎也有效。
我也检查了类似的问题,但this
类的指针似乎是有效的,我没有创建任何可能溢出的缓冲区。也没有任何东西可以提前删除/释放对象。
我不知道是什么导致了错误。:/
感谢:D
编辑:这是一个孤立的测试,具有相同的错误:我的主要功能是:
INT APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, INT)
{
App *app = new App();
app->Run();
app->Release();
}
在我的App
课堂上,我删除了所有窗口功能和任何其他变量,使其看起来像这样:
App::App()
{
dxClass = new DXClass();
}
App::~App()
{
delete dxClass;
}
void App::Run()
{
dxClass->Initialize();
while (true) {} // Never reaches here
}
访问冲突仍然发生在同一个地方。此外,如果我将工厂实例变量替换为:
IDXGIFactory *f;
HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&f);
这在其他应用程序中对我有用。