gpt4 book ai didi

调用实例方法时出现 C++ 访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:30 24 4
gpt4 key购买 nike

我正在创建一个看起来有点像这样的 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,如果按上述方式更改,应用程序将正常启动。但是,另一方面,应用程序在退出时收到另一个访问冲突。调试器指向 ID3D11ShaderResourceView* 上的 Release() 调用,我已在我的代码片段中指出了这一点。这个指针似乎也是有效的。

我也检查了类似的问题,但是类的 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);

它在其他应用程序中对我有用。

最佳答案

调用 Release() 时的访问冲突通常意味着该对象已经从其他地方接收到它的最终 Release() (并且它已经销毁了自己)。一种可能的解决方案是在将指针传递到 DXClass 时使用 AddRef()

关于调用实例方法时出现 C++ 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com