次の関数があるとしましょう (mVertexShader
はstd::shared_ptr< ID3D11VertexShader >
クラス メンバーであり、mRenderData
他の D3D のものを保持する POD です):
void VertexShader::CreateShader( void )
{
GVertexShader* raw_VertexShader = mVertexShader.get();
mRenderData->Device->CreateVertexShader(
mCompiledShader->GetBufferPointer(),
mCompiledShader->GetBufferSize(),
NULL,
&raw_VertexShader
);
delete raw_VertexShader;
raw_VertexShader = NULL;
}
生のポインターを返すのでmVertexShader.get()
、削除すると内raw_VertexShader
のポインターに影響しますか、または指しているメモリは同じですが、ポインター自体は完全に異なりますか? mVertexShader.get()
私は後者を推測しているので、そもそもポインターへの参照が存在する理由ですが、正しい考えを持っていることを確認したいと思います。
注:私は現在 MSVC++ を使用していますが、MSVC++ と MinGW/GCC がこれを実装する方法に大きな違いがあるかどうかを聞いていただければ幸いです。
注 2:明確でなかったら申し訳ありません。ここでは D3D のセマンティクスについてはまったく言及していませんが、メモリ管理、データ転送、および動的メモリ割り当てに関する C++ 自体の言語のセマンティクスについては言及していません。その意味で、生のポインターが関数から返されたときに何が起こるかを正確に理解しようとしています。
mVertexShader
つまり、任意の VertexShader への単純な生のポインターを格納していると仮定すると、そのメソッドを呼び出すと、コンテナー内にあるものと同じメモリ アドレスを参照するコピーされたget()
ポインターが返されますか、それともまったく新しいものですか?メモリが別のアドレスを指している状態で、コピーされて返されたポインタ全体ですか?shared_ptr