2012-04-08 6 views
1

이 같은 종류의 보이는 다이렉트 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); 

다른 애플리케이션에서 저에게 효과적이었습니다.

+2

오류는 표시하는 코드에있는 것이 아니라 코드를 사용하는 다른 곳에서 발생하는 것입니다. 최소한의 독립적 인 테스트 케이스를 만들고 조각이 아닌 *를 게시하십시오. –

+1

나는 무슨 일이 벌어지고 있는지에 대한 충분한 정보가 여기 있다고 생각하지 않는다. 그런데 CComPtr을 사용해야합니다. http://msdn.microsoft.com/en-us/library/ezzw7k98(v=vs.80).aspx – dsharlet

+0

가장 많이 사용되는 변수는 다음과 같습니다. 문제를 일으키는 '공장'은 아무데도 나오지 않는다. 코드가 표시되지 않습니다. –

답변

1

Release()를 호출 할 때 액세스 위반은 일반적으로 개체가 다른 릴리스의 최종 Release()를 이미 받았음을 의미합니다 (자체를 파괴했습니다). 한 가지 가능한 해결책은 DXClass에 포인터를 전달할 때 AddRef()를 사용하는 것입니다.

+0

클래식 사용 후 시나리오처럼 들리는 데 동의합니다. –

+0

고마워요. 알아 냈습니다. 'CreateDXGIFactory()'에서 몇 줄 아래에 있습니다. 어댑터가 초기화되지 않았거나 NULL로 설정되었을 때 논리 NOT ('! adapter')을 수행했습니다.: S 나는 오류가 어떻게 든'Release()'에러를 간접적으로 일으켰다 고 생각합니다. 왜냐하면 이제는 모든 것이 작동하기 때문입니다. – wquist