Подтвердить что ты не робот

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. Есть ли что-нибудь подобное?

4b9b3361

Ответ 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