이 같은 종류의 보이는 다이렉트 X 11 헬퍼 클래스를 만드는거야 호출 할 때 : dxClass = new DXClass();
Initialize()
기능이 다른 방법에 호출 :이 클래스는 다음과 같이 초기화C++ 액세스 위반 인스턴스 메소드
#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
을 생성 한 클래스의
응용 프로그램을 실행하면 setupDisplay()
함수의 시작 부분에서 액세스 위반이 발생합니다. 그러나 setupDisplay()
코드를 취하여 Initialize()
에 넣고 setupDisplay()
에 대한 호출을 제거하면 액세스 위반이 발생하지 않습니다. 또한 setupDisplay()
에서 코드를 제거하여 빈 함수가되고 Initialize()
으로 호출하면 액세스 위반이 발생하지 않습니다.
포인터가 NULL이 아니며 응용 프로그램이 위에서 설명한대로 변경되면 잘 시작됩니다. 그러나 다른 메모에서 응용 프로그램을 종료 할 때 다른 액세스 위반이 발생합니다. 디버거는 ID3D11ShaderResourceView*
에있는 Release()
호출을 가리키며,이 코드는 내 코드 스 니펫에서 지적했습니다. 이 포인터는 유효합니다.
비슷한 질문도 확인했지만 클래스의 this
포인터가 유효하고 오버플로가 될 수있는 버퍼를 만들지는 않습니다. 개체를 일찍 삭제하거나 해제 할 수있는 것도 없습니다.
나는 오류의 원인이 무엇인지 알지 못합니다. :/
는감사합니다 : D
는 편집 : 여기에 같은 오류가 고립 된 테스트는,이다 : 내 주요 기능에있는 : 내 App
클래스에서
INT APIENTRY wWinMain(HINSTANCE, HINSTANCE, LPWSTR, INT)
{
App *app = new App();
app->Run();
app->Release();
}
, 나는 모두 제거했습니다 창 기능 및 기타 변수가 다음과 같이 표시됩니다.
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);
다른 애플리케이션에서 저에게 효과적이었습니다.
오류는 표시하는 코드에있는 것이 아니라 코드를 사용하는 다른 곳에서 발생하는 것입니다. 최소한의 독립적 인 테스트 케이스를 만들고 조각이 아닌 *를 게시하십시오. –
나는 무슨 일이 벌어지고 있는지에 대한 충분한 정보가 여기 있다고 생각하지 않는다. 그런데 CComPtr을 사용해야합니다. http://msdn.microsoft.com/en-us/library/ezzw7k98(v=vs.80).aspx – dsharlet
가장 많이 사용되는 변수는 다음과 같습니다. 문제를 일으키는 '공장'은 아무데도 나오지 않는다. 코드가 표시되지 않습니다. –