2009-06-25 41 views
32

總之,我想知道是否有一個類似於數組的auto_ptr類型。我知道我可以推出自己的產品,我只是確保那裏沒有東西。陣列的auto_ptr

我也瞭解向量。但我不認爲我可以使用它們。我正在使用幾個Windows API/SDK,例如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對象。有沒有這樣的事情?

回答

41

使用

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

或因爲C++ 11

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

代替。


附加: 如果有人問,如果Vectors are guaranteed to be contiguous答案是因爲C++標準03。還有一個已經討論過的thread


如果C++ 11由編譯器所支持,的unique_ptr可用於陣列。

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

是啊。矢量,而不是數組。 – 2009-06-25 16:15:42

+0

確保載體是連續的內存塊嗎? – heavyd 2009-06-25 16:20:50

9

在當前std庫中沒有任何內容。但是,未來的標準C++ 0x有一個unique_ptr,它取代了auto_ptr,並且它適用於數組。

第一種實現可以在這裏找到: unique_ptr