要するに、配列のauto_ptrのようなタイプがあるかどうか疑問に思っています。私は自分で転がすことができることを知っています、私はただそこにまだ何かがないことを確認しています。
ベクトルについても知っています。しかし、私はそれらを使用できないと思います。私は、Windows Media SDK、Direct ShowAPIなどのいくつかのWindowsAPI/SDKを使用しています。これらは、いくつかの構造を取得して、ポインターとサイズを2回受け取る関数を呼び出すためのものです。探しているデータを受信するために割り当てなければならない構造体のサイズを取得するためのポインターとして初めてNULLを渡すとき。例えば:
CComQIPtr<IWMMediaProps> pProps(m_pStreamConfig);
DWORD cbType = 0;
WM_MEDIA_TYPE *pType = NULL;
hr = pProps->GetMediaType(NULL, &cbType);
CHECK_HR(hr);
pType = (WM_MEDIA_TYPE*)new BYTE[cbType]; // Would like to use auto_ptr instread
hr = pProps->GetMediaType(pType, &cbType);
CHECK_HR(hr);
// ... do some stuff
delete[] pType;
CbTypeは通常、sizeof(WM_MEDIA_TYPE)よりも大きく返されます。これは、その中に別の構造体へのポインターがあるため、WM_MEDIA_TYPEオブジェクトを割り当てることはできません。このようなものはありますか?
使用する
std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)&buffer[0];
またはC++ 11以降
std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)buffer.data();
代わりに。
追加:誰かが ベクトルが連続していることが保証されている かどうかを尋ねている場合、C++ 03標準以降、答えははいです。すでにそれについて議論した別の スレッド があります。
C++ 11がコンパイラでサポートされている場合は、unique_ptrを配列に使用できます。
unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
pType = (WM_MEDIA_TYPE*)buffer.get();
ブースト - scoped_array
または、ブーストを使用できます scoped_ptr
カスタム削除機能を使用
現在の標準ライブラリにはこれには何もありません。ただし、将来の標準C++ 0xにはunique_ptrがあります。これは、auto_ptrの代わりに使用され、配列で機能します。
最初の実装はここにあります: nique_ptr
STLにはありません。 Boostには、同様のアイデアを持ついくつかのスマートポインターがあります。チェックアウト scoped_array および shared_array