Вопрос по c++, arrays – auto_ptr для массивов

32

Короче говоря, мне интересно, существует ли тип auto_ptr для массивов. Я знаю, что могу кататься самостоятельно, я просто проверяю, что там уже ничего нет.

Я знаю и о векторах. однако я не думаю, что смогу их использовать. Я использую несколько API / SDK для Windows, таких как Windows Media SDK, Direct Show API, которые для возврата некоторых структур вызывают функцию, которая принимает указатель и размер дважды. Первый раз, когда в качестве указателя возвращается NULL, чтобы вернуть размер структуры, которую я должен выделить для получения данных, которые я ищу. Например:

<code>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;
</code>

Поскольку cbType обычно возвращается больше, чем sizeof (WM_MEDIA_TYPE), поскольку в нем есть указатель на другую структуру, я не могу просто выделить объекты WM_MEDIA_TYPE. Есть ли что-нибудь подобное?

Ваш Ответ

4   ответа
42

std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)&buffer[0];

или сC++11

std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)buffer.data();

вместо.

Дополнительно: Если кто-то спрашивает, еслиВекторы гарантированно будут смежными ответYes начиная с C ++ 03 стандарт. Есть еще однонить это уже обсуждалось.

ЕслиC++11 поддерживается вашим компилятором, unique_ptr может использоваться для массивов.

unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
pType = (WM_MEDIA_TYPE*)buffer.get();
Гарантируются ли векторы последовательными блоками памяти? heavyd
Ага. Векторы, а не массивы.
@ Heavyd Да - стандарт C ++ гарантирует это.
Можете ли вы исправить пример использования std :: vector & lt; & gt; :: data (). data () уже возвращает указатель, поэтому нет необходимости в & amp; & amp;
@ Иван, я не согласен. Если вы не используете std :: vector, вам нужно будет использовать умный указатель или написать весь код удаления самостоятельно, устраняя проблемы исключений и т. Д. В любом случае std :: vector не более сложен и вполне может будь проще.
3

верять, выписыватьсяscoped_array а такжеshared_array

10

scoped_array или вы можете использовать повышениеscoped_ptr с пользовательским удалителем

9

в будущем стандарте C ++ 0x есть unique_ptr, который заменяет auto_ptr и работает с массивами.

Первая реализация может быть найдена здесь: unique_ptr

Вы должны четко дать понять, что для того, чтобы unique_ptr работал, вам необходимо предоставить пользовательское средство удаления.
Необязательно, см. Раздел «Безопасная поддержка массивов».
ааа, я исправлюсь +1 для тебя;).

Похожие вопросы