数组的auto_ptr

时间:2009-06-25 16:05:29

标签: c++ arrays memory-management

简而言之,我想知道数组是否有类似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对象。那里有这样的东西吗?

4 个答案:

答案 0 :(得分:42)

使用

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

C ++ 11

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

代替。


其他: 如果有人问自{C ++ 03标准以来Vectors are guaranteed to be contiguous答案是。还有另一个thread已经讨论过了。


如果编译器支持 C ++ 11 ,则unique_ptr可用于数组。

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

答案 1 :(得分:10)

提升scoped_array或者您可以将boost scoped_ptr与自定义删除器一起使用

答案 2 :(得分:9)

当前的std库中没有任何内容。但是,未来的标准C ++ 0x有一个unique_ptr,它取代了auto_ptr,可以用于数组。

可在此处找到第一个实现: unique_ptr

答案 3 :(得分:3)

不在STL中。 Boost有一些类似想法的智能指针。查看scoped_arrayshared_array