はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング メモリリークが治った

あいさつ

どうも、はかせです。
前回、前々回とメモリリークに苦しめられてきました。
ですが、今回でその戦いにも終止符が打たれます。

リークしていたもの

前回の記事でもあげましたが、
私が殲滅しなければいけないやつらはこいつらです。
f:id:hakase0274:20190627231233p:plain

色々あるんですが、まとめてしまうと
描画に関するもの全てです。

解決

結論から言うと手動で徹底的に破棄しました
私のプログラムは基本スマートポインタ頼りの管理をしていました。
(ぶっちゃけ楽だったし・・・)

ただ、その状態でリークが発生してしまったので
色々処理順とか弄ってみたんですが解決できませんでした。

なので最終手段「ゴリ押し」
あえてリークしていたリソースを生ポインタで扱い、
私が自ら責任もって確保と解放を行いました。

さらに解放の際にも単純にReleaseするだけでなく、
ダメ押しと言わんばかりにnullptrを代入しました。

//テクスチャ情報を保持
struct TEXTURE_DATA
{
	std::wstring fileName;
	ID3D11Resource* texture;
	ID3D11ShaderResourceView* shaderView;
	~TEXTURE_DATA() 
	{
		if (texture) 
		{
			texture->Release();
			texture = nullptr;
		}
		if (shaderView) 
		{
			shaderView->Release();
			shaderView = nullptr;
		}
	}
};

その結果
f:id:hakase0274:20190628224039p:plain
やったー!!!
遂にあの憎たらしいメモリリーク警告が消え去りました!
いやーERRORもWARNINGもでてないコンソールってのは気持ちがいいですね!

ちょっと紹介

今回デバッグをする上で大量のログを出しました。
そのため今までのVSのログだとエラーなのかわかりにくかったです。

なので今回一つ拡張を入れました。
github.com

これはログに色を付けてくれる拡張です。
f:id:hakase0274:20190628224446p:plain
f:id:hakase0274:20190628224459p:plain
f:id:hakase0274:20190628224602p:plain

わかりやすい・・・!

追加の改良点

今回メモリリーク解決のために色々データの持ち方とか
作り方とか弄ってたら初期ロードの時間が3分の1ぐらいになりました。

今現状使っているシェーダーだと、どのみち作るBufferやSamplerとか
変わらないので最初に一つ作るだけにしたのが大きかったなと思います。

あとがき

今回はメモリリーク解消の話でした。
やっぱりメモリリークとかって起こしちゃうと
デバッグがしんどいですね・・・orz

リークしてたのが描画周りのCOMってことで割と
色んなとこから参照があって犯人の特定がついぞできませんでした。

なのでゴリ押しの力技で解決しました。
これで解放されてなかったら
私にはCOMオブジェクトの解放は無理だヽ( ̄ー ̄ )ノ

それでは今回はこの辺でノシ