2012-04-08 30 views
1

私はこのような種類の見えDirectX 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

EDIT: はここで同じエラーが発生して、分離されたテストです:私の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

問題を引き起こしている、 'factory'はどこからも出てこない。コードはそれを示していません。 –

答えて

1

Release()を呼び出すときのアクセス違反は、通常、オブジェクトが既に別の場所から最終Release()を受け取ったことを意味します(それ自体が破壊されています)。あなたのDXClassにポインタを渡すときにAddRef()を使うことが考えられます

+0

これは古典的な使用後のシナリオのように聞こえることに同意します。 –

+0

ありがとう - 私はそれを考え出した。 'CreateDXGIFactory()'の下に数行しかありませんでした。アダプターが決して初期化されていないか、NULLに設定されていないときは論理NOT( '!adapter')を実行していました。:S私は、エラーが間違いなく 'Release()'エラーを間接的に引き起こしていたと思います。 – wquist