web-dev-qa-db-ja.com

配列のauto_ptr

要するに、配列の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オブジェクトを割り当てることはできません。このようなものはありますか?

32
heavyd

使用する

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();
42
Totonga

ブースト - scoped_array または、ブーストを使用できます scoped_ptr カスタム削除機能を使用

10
Evan Teran

現在の標準ライブラリにはこれには何もありません。ただし、将来の標準C++ 0xにはunique_ptrがあります。これは、auto_ptrの代わりに使用され、配列で機能します。

最初の実装はここにあります: nique_ptr

9
Jem

STLにはありません。 Boostには、同様のアイデアを持ついくつかのスマートポインターがあります。チェックアウト scoped_array および shared_array

3
Fred Larson