数组的auto_ptr

hea*_*vyd 32 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;
Run Code Online (Sandbox Code Playgroud)

由于cbType通常返回大于sizeof(WM_MEDIA_TYPE),因为事实上有一个指向其中另一个结构的指针,我不能只分配WM_MEDIA_TYPE对象.那里有这样的东西吗?

Tot*_*nga 42

使用

std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)&buffer[0];
Run Code Online (Sandbox Code Playgroud)

或者从C++ 11开始

std::vector<BYTE> buffer(cbType);
pType = (WM_MEDIA_TYPE*)buffer.data();
Run Code Online (Sandbox Code Playgroud)

代替.


附加:如果有人问是否保证向量是连续的,那么自C++ 03标准以来答案是肯定的.还有另一个线程已经讨论过了.


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

unique_ptr<BYTE[]> buffer(new BYTE[cbType]);
pType = (WM_MEDIA_TYPE*)buffer.get();
Run Code Online (Sandbox Code Playgroud)

  • @Heavyd是 - c ++标准保证了这一点. (5认同)
  • @Evan我不同意.如果你不使用std :: vector,你将不得不使用智能指针或自己编写所有删除代码,解决异常问题等.在任何一种情况下,std :: vector都不复杂,并且很可能更简单. (4认同)

Eva*_*ran 10

提升scoped_array或者你可以使用scoped_ptr自定义删除器使用boost


Jem*_*Jem 9

在当前的std库中没有任何内容.但是,未来的标准C++ 0x有一个unique_ptr,它取代了auto_ptr,并且与数组一起使用.

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