スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

謎のエラー 「 0xC0000005 」・・・!

作業は順調かと思われたのですが、
ここに来て謎のエラーに遭遇。

その名も 0xc0000005。

【参考画像】
0xC0000005.jpg


エラー 0xc0000005 というのは、メモリのアクセス違反とかした時に出るエラーなのですが、
今回 分からないのは、 その原因です。
本当にさっぱり分からない。 全くもって謎。


とりあえず、DirectXのプログラムでは 下記の様な事をしてました。

----------------------------------------
【1】頂点座標のバッファ確保
【2】法線のバッファ確保
【3】UV座標のバッファ確保
//以下略

----------------------------------------

【1】、【2】は問題ないのですが、【3】でエラーが発生します。


それぞれのバッファ確保は、下記のようにしてるのですが、
--------------------------------
・CreateVertexBuffer関数を呼ぶ
・Lock関数を呼ぶ
・データの格納
・UnLock関数を呼ぶ

--------------------------------
UV座標の時だけCreateVertexBuffer関数が失敗している
みたいなのです。

HRESULT型の変数を見てみたところ、
E_OUTOFMEMORY というエラーコードが返っていたのですが、
E_OUTOFMEMORY・・・Direct3D が呼び出しを完了するための十分なメモリを割り当てられなかった。

UV座標数 400越えのバッファ確保は成功して、
UV座標数 50程度のバッファ確保は失敗するんですよ。

メモリが少なすぎて割り当てられなかったのかな? と思ったのですが、
遥かに少ない方のバッファ確保が失敗するとは一体・・・?


その後、 UV座標のバッファ確保を一番初めに持って来ました。
----------------------------------------
【1】UV座標のバッファ確保
【2】頂点座標のバッファ確保
【3】法線のバッファ確保
//以下略

----------------------------------------
すると、 エラーが出ない。
400の時も、50程度の時も、CreateVertexBuffer関数が成功しました。

しかし、今度は 一番最後のDirectXのデバイスを開放(Release)する所で
同様の0xc0000005エラーが発生するようになりました。

もう、何コレ。何なの?


で、次に 400越えのヤツが偶数個、50程度のヤツが奇数個のバッファ確保をしていたので、
偶数個のバッファ確保にすれば良いのかな? と思い、
奇数個のバッファのときは、1つ余分に確保して偶数個になるようにしてみました。

if(m_UVNum % 2 == 0){
hr = d9.GetDevice()->CreateVertexBuffer(
m_UVNum * sizeof(VERTEX_UV),
D3DUSAGE_WRITEONLY,
D3DFVF_TEX1,
D3DPOOL_MANAGED,
&m_Buf,
NULL);
}else{
hr = d9.GetDevice()->CreateVertexBuffer(
(m_UVNum + 1) * sizeof(VERTEX_UV),
D3DUSAGE_WRITEONLY,
D3DFVF_TEX1,
D3DPOOL_MANAGED,
&m_Buf,
NULL);
}

すると、CreateVertexBuffer関数も、最後のデバイス開放も成功しました。


しかし、 原因は 偶数、奇数だったのか?と疑問に思い、
それを確かめるため、試しにどちらも奇数個のバッファを確保するようにしてみました。

if(m_UVNum % 2 == 0){
hr = d9.GetDevice()->CreateVertexBuffer(
m_UVNum * sizeof(VERTEX_UV),
D3DUSAGE_WRITEONLY,
D3DFVF_TEX1,
D3DPOOL_MANAGED,
&m_Buf,
NULL);
}else{
hr = d9.GetDevice()->CreateVertexBuffer(
m_UVNum * sizeof(VERTEX_UV),
D3DUSAGE_WRITEONLY,
D3DFVF_TEX1,
D3DPOOL_MANAGED,
&m_Buf,
NULL);
}

すると なんとコレも成功。
もう意味が分からない。

全く無意味なelseを書いたらバグが出なくなりました。
一応、コレで問題が発生しなくなったんですけど、原因が凄く気になる。
なんじゃこりゃー(´・ω・`)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

No title

原因がわからないエラーって厄介ですよね…
私もこの原因はわかりませんが、怪しいとしたらD3DPOOL_MANAGEDでしょうかねぇ。

No title

原因が分からないものは、本当に面倒ですねv-292
-------------------------------------------------------
・他のPCでやってみたらバグが再現されなかった
・今まで実行できていたのに、突然 エラーが出て実行できなくなった

-------------------------------------------------------
などなど。

確かに、今回はD3DPOOL_MANAGEDが怪しいような気がします。
デバイスの開放の部分でエラーが出るようになったりしたので、
DirectX側でのメモリ確保で何か異常が起きているのかなと思いました。
(何らかの理由で、自分自身を上書きするような メモリ確保を行ったりとか)

承認待ちコメント

このコメントは管理者の承認待ちです
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。