автоматический ptr для массивов



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



Я также знаю о векторах. однако я не думаю, что смогу ими воспользоваться. Я использую несколько API/SDK для Windows, таких как Windows Media SDK, 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. Есть ли там что-нибудь подобное?

696   4  

4 ответов:

Использовать

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 или вы можете использовать boost scoped_ptr с пользовательским deleter

В текущей библиотеке std нет ничего для этого. Однако будущий стандарт C++0x имеет unique_ptr, который приходит на смену auto_ptr и который работает с массивами.

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

Не в STL. Boost имеет несколько умных указателей с аналогичной идеей. Проверьте scoped_array и shared_array

Comments

    Ничего не найдено.