はかせのラボ

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

プログラミング ComPtrのダブルポインタが欲しい場合はGetAddressOf()を使おう

あいさつ

どうも、はかせです。
今回は前回の描画されない問題を解決できたので
そのまとめです。

ComPtrの&演算子

DirectXの各種設定をしていくと、
よくデバイスダブルポインタを求められます。
基本的にダブルポインタを取るときには

&デバイスのポインタ

こんな感じで書くと思います。

ただComPtrには&演算子オーバーロードが設定されており、
その動きは新しくポインタをあてがう動きとなっています。
これはCreate関数で使うことを想定された動きだと思います。

ただそれ以外のタイミングで使うと、
新しくあてがうということで既存のポインタが解放されてしまいます。
今までうまく動かなかったのはそれが原因だったわけですね。

ComPtrのGet系

ComPtrにはいくつか保持しているポインタを入手する関数があります。
ComPtrに設定されている演算子オーバーロードでは解決できない動きをする時に使います。

ComPtr<T>.Get()

ComPtrが保持するポインタをそのまま取得します。
ポインタの管理はComPtrのままなので勝手に破棄とかできません。

ComPtrは暗黙的に保持しているポインタの型に変換されないため、
関数とかでポインタ本体が必要な時に使います。

ComPtr<T>.GetAddressOf()

ComPtrが保持するポインタのポインタ(ダブルポインタ)を取得します。
ポインタの管理はComPtrのままなので勝手に破棄とかできません。

今回の問題の&演算子オーバーロード
中身が新しくされたら困るときに使います。

ComPtr<T>.ReleaseAndGetAddressOf()

ComPtrが保持するポインタのポインタ(ダブルポインタ)を取得します。
GetAddressOf()との違いはComPtrが管理を続けるかどうかです。
名前の通りReleaseしてダブルポインタを返し、
新しくポインタをあてがいます。

今のところこれを使いたくなる場面が私は思いつきません。

実行結果

さて、ComPtrの問題を解決したところで、
実行してみます。
f:id:hakase0274:20190609231026p:plain
(過去のやつ引っ張ってきたら三角形じゃなくて面だった)
いやはや解決してよかったです。

あとがき

今回はComPtrの勉強回でした。
前回はDirectX関連は全部生ポインタでやってたので
ちゃんとスマートポインタ使おうとしたら変なハマり方しましたね。

ただおかげでポインタの管理が楽になりました。
C++って勉強進めれば進めるほど、
目に見えて楽になるのが楽しいですよね。

それでは今回はこの辺でノシ
今回作ったものはgithubに上げました
github.com