32 votes

C++ auto_ptr pour les tableaux

En bref, je me demande s'il existe un type de type auto_ptr pour les tableaux. Je sais que je pourrais créer le mien, mais je veux juste m'assurer qu'il n'existe pas déjà quelque chose.

Je connais également les vecteurs, mais je ne pense pas pouvoir les utiliser. J'utilise plusieurs API/SDK Windows tels que Windows Media SDK, Direct Show API qui, pour récupérer certaines structures, appellent une fonction qui prend un pointeur et une taille deux fois. La première fois, en passant NULL comme pointeur, je récupère la taille de la structure que je dois allouer afin de recevoir les données que je recherche. Par exemple :

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;

Puisque cbType revient généralement plus grand que sizeof(WM_MEDIA_TYPE) parce qu'il contient un pointeur vers une autre structure, je ne peux pas simplement allouer des objets WM_MEDIA_TYPE. Existe-t-il quelque chose de ce genre ?

42voto

Totonga Points 2162

Utilisez

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

ou depuis C++11

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

à la place.


supplémentaire : Si quelqu'un demande si le Les vecteurs sont garantis contigus. la réponse est depuis la norme C++ 03. Il existe une autre filetage qui en ont déjà parlé.


Si C++11 est supporté par votre compilateur, unique_ptr peut être utilisé pour les tableaux.

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

10voto

Evan Teran Points 42370

Booster scoped_array ou vous pouvez utiliser boost scoped_ptr avec un suppresseur personnalisé

9voto

Jem Points 1702

Il n'y a rien pour cela dans la bibliothèque std actuelle. Cependant, le futur standard C++0x a un unique_ptr, qui vient en remplacement de auto_ptr, et qui fonctionne avec les tableaux.

Une première mise en œuvre peut être trouvée ici : unique_ptr

3voto

Fred Larson Points 27404

Pas en STL. Boost a quelques pointeurs intelligents avec une idée similaire. Consultez Tableau de cadrage y tableau partagé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X