Auto_ptr для массивов
Короче говоря, мне интересно, есть ли такой тип auto_ptr для массивов. Я знаю, что смогу катиться самостоятельно, я просто убедился, что там уже ничего нет.
Я знаю и об векторах. однако я не думаю, что могу их использовать. Я использую несколько Windows API/SDK, таких как SDK Windows Media, Direct Show API, который позволяет вернуть некоторые структуры для вызова функции, которая дважды занимает указатель и размер. Первый раз, когда 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. Есть ли что-нибудь подобное?
Ответы
Ответ 1
Используйте
std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)&buffer[0];
или с С++ 11
std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)buffer.data();
вместо.
Дополнительно:
Если кто-то спрашивает, если Векторы гарантированно будут смежными, ответ будет Да со стандартом С++ 03. Существует еще один поток, который уже обсуждался.
Если С++ 11 поддерживается вашим компилятором, unique_ptr может использоваться для массивов.
unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
pType = (WM_MEDIA_TYPE*)buffer.get();
Ответ 2
boost scoped_array
или вы можете использовать boost scoped_ptr
с пользовательским удалением
Ответ 3
В текущей библиотеке std нет ничего. Тем не менее, будущий стандарт С++ 0x имеет уникальный_ptr, который заменяет auto_ptr и работает с массивами.
Первая реализация может быть найдена здесь:
unique_ptr
Ответ 4
Не в STL. У Boost есть некоторые умные указатели с аналогичной идеей. Проверьте scoped_array и shared_array