автоматический 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. Есть ли там что-нибудь подобное?
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или вы можете использовать boostscoped_ptrс пользовательским deleter
В текущей библиотеке std нет ничего для этого. Однако будущий стандарт C++0x имеет unique_ptr, который приходит на смену auto_ptr и который работает с массивами.
Первую реализацию можно найти здесь: unique_ptr
Не в STL. Boost имеет несколько умных указателей с аналогичной идеей. Проверьте scoped_array и shared_array
Comments