私は、新しい C++ 標準スマート ポインターunique_ptr、shared_ptr、weak_ptrに関連するさまざまな使用上のアドバイスについて読んでおり、一般に、それらを宣言して使用する独自のコードを作成するときにそれらが何であるかを「理解」しています。
ただし、私が読んだすべての議論は、プログラマーが自分のコードでスマートを使用しているこの単純な使用状況に限定されているようで、生のポインターまたは他のタイプの ' COM インターフェイス ポインタなどのスマート ポインタ。
具体的には、Direct2D と DirectWrite を使用してフレーム/秒を表示するディスプレイにテキストをレンダリングする標準の Win32 リアルタイム ゲーム ループを起動して実行することで、C++ を使って学習しています。
Direct2D に関する私の最初のタスクは、MSDN の Direct2D サンプルから次のコードを使用して、Direct2D ファクトリ オブジェクトを作成することです。
ID2D1Factory* pD2DFactory = nullptr;
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
pD2DFactoryは明らかに「出力」パラメーターであり、実際に可能である場合、このコンテキストでスマートポインターを使用する方法が不明確になるのはここです。私の経験の浅い C++ の心は、2 つの問題があることを教えてくれます。
- pD2DFactoryが COM インターフェイス ポインター型である場合、smart_ptr は COM オブジェクト インスタンスの Add() / Release() メンバー関数とどのように連携しますか?
- 関数が 'out' ポインター パラメーター手法を使用している状況で、スマート ポインターを関数に渡すことはできますか?
comip.hヘッダー ファイルで _com_ptr_t を使用してポインターの有効期間管理を支援する代替手段を試し、次のコードでpD2DFactoryポインターを宣言しました。
_com_ptr_t<_com_IIID<pD2DFactory, &__uuidof(pD2DFactory)>> pD2DFactory = nullptr;
これまでのところ機能しているように見えますが、ご覧のとおり、構文は面倒です:)
そこで、このような場合にスマート ポインターが役立つかどうかを確認し、使用例を提供してくれるか、または他のコード ライブラリを使用する必要がある場合にスマート ポインターの使用法について詳しく説明できるかどうかを C++ の専門家が確認できるかどうか疑問に思っていました。それらのことを何も知らない。それとも、仕事に間違ったツールを使用しようとしているだけですか? :)