2009-06-25 16 views
32

W skrócie, zastanawiam się, czy istnieje typ auto_ptr jak dla tablic. Wiem, że mogłem rzucić własną, upewniam się tylko, że czegoś tam nie ma.auto_ptr dla tablic

Wiem również o wektorach. jednak nie sądzę, abym mógł z nich korzystać. Używam kilku interfejsów API Windows/SDK, takich jak Windows Media SDK, Direct Show API, które w celu odzyskania niektórych struktur wywołują funkcję, która dwukrotnie pobiera wskaźnik i rozmiar. Pierwszy raz przekazuję NULL jako wskaźnik, aby odzyskać rozmiar struktury, którą muszę przydzielić, aby otrzymać dane, których szukam. Na przykład:

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; 

Od cbType zazwyczaj wraca większy niż sizeof (WM_MEDIA_TYPE) ze względu na fakt, to jest wskaźnik do innej struktury w nim, nie mogę po prostu przeznaczyć obiektów WM_MEDIA_TYPE. Czy jest coś takiego?

Odpowiedz

41

Korzystając

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

lub od momentu C++ 11

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

zamiast.


dodatkowe: Jeśli ktoś pyta, czy w Vectors are guaranteed to be contiguous odpowiedź jest Tak ponieważ standard C++ 03. Jest inny thread, który już omawiałem.


Jeśli C++ 11 jest obsługiwana przez kompilator może unique_ptr być stosowany do tablic.

unique_ptr<BYTE[]> buffer(new BYTE[cbType]); 
pType = (WM_MEDIA_TYPE*)buffer.get(); 
+0

Tak. Wektory, a nie tablice. –

+0

Czy wektory gwarantują ciągłe blokowanie pamięci? – heavyd

+5

@Heavyd Tak - standard C++ to gwarantuje. –

9

Nie ma nic do tego w obecnej bibliotece standardowej. Jednak przyszły standard C++ 0x ma unikalny_ptr, który zastępuje auto_ptr i działa z tablicami.

Pierwsza realizacja można znaleźć tutaj: unique_ptr

+0

powinieneś wyjaśnić, że aby unique_ptr działał, musisz dostarczyć niestandardowy deleter. –

+0

Niekoniecznie, patrz sekcja "Bezpieczna obsługa tablic" – Jem

+0

ahh, poprawiam się. +1 dla ciebie;). –

Powiązane problemy