32 Stimmen

auto_ptr für Arrays

Kurz gesagt, ich frage mich, wenn es eine auto_ptr wie Typ für Arrays. Ich weiß, ich könnte meine eigenen rollen, ich bin nur sicher, dass es nicht bereits etwas da draußen ist.

Ich kenne mich auch mit Vektoren aus, aber ich glaube nicht, dass ich sie verwenden kann. Ich verwende mehrere der Windows-APIs/SDKs wie das Windows Media SDK, Direct Show API, die, um einige Strukturen zurück zu bekommen, eine Funktion aufrufen, die einen Zeiger und eine Größe zweimal nimmt. Beim ersten Mal wird NULL als Zeiger übergeben, um die Größe der Struktur zurückzubekommen, die ich zuweisen muss, um die gesuchten Daten zu erhalten. Zum Beispiel:

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;

Da cbType typischerweise größer als sizeof(WM_MEDIA_TYPE) aufgrund der Tatsache zurückkommt, ist ein Zeiger auf eine andere Struktur in ihm hat, kann ich nicht einfach WM_MEDIA_TYPE-Objekte zuweisen. Gibt es etwas wie dieses da draußen?

42voto

Totonga Punkte 4152

Verwenden Sie

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

oder seit C++11

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

stattdessen.


Zusätzlich: Wenn jemand fragt, ob die Die Vektoren sind garantiert zusammenhängend die Antwort lautet Ja seit C++ 03 Standard. Es gibt eine weitere Gewinde die bereits darüber diskutiert haben.


Si C++11 von Ihrem Compiler unterstützt wird, kann unique_ptr für Arrays verwendet werden.

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

10voto

Evan Teran Punkte 83711

Erhöhen scoped_array oder Sie können boost verwenden scoped_ptr mit einem benutzerdefinierten Löschprogramm

9voto

Jem Punkte 2175

In der aktuellen Standardbibliothek gibt es dafür nichts. Der zukünftige Standard C++0x hat jedoch eine unique_ptr, die auto_ptr ersetzt und mit Arrays arbeitet.

Eine erste Umsetzung ist hier zu finden: eindeutig_ptr

3voto

Fred Larson Punkte 58721

Nicht in STL. Boost hat einige intelligente Zeiger mit einer ähnlichen Idee. Ausprobieren scoped_array y shared_array

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X