2009-06-25 40 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