【发布时间】:2015-10-22 06:48:59
【问题描述】:
我有一个函数用于分配给定大小的缓冲区。缓冲区将在返回之前预处理/填充一些数据。此预处理可能返回 false 以表示此缓冲区未正确处理。所以我想在这个缓冲区上应用 RAII 以避免在没有delete[] 它的情况下提前返回。
通常我使用unique_ptr 来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(由unique_ptr 拥有)并将所有权转移给调用者。但是编译器抱怨我无法将unique_ptr<T[]> 转换为T* 而我std::move unique_ptr。看起来unique_ptr 只能移动到另一个unique_ptr 而不是原始指针。
有什么方法可以将所有权从unique_ptr 转移到raw pointer?或者只是unique_ptr 不适合这种情况?
bool PreProcess(int* v) { /* return nothing wrong? true: false; */ }
bool GetBuffer(int** ppRetBuf, int size)
{
std::unique_ptr<int[]> buf(new (std::nothrow) int[size]());
if(PreProcess(buf.get())
{
*ppRetBuf = std::move(buf); // Compiler complains:
// Error C2440 '=': cannot convert from 'std::unique_ptr<int [],std::default_delete<_Ty>>' to 'int *'
return true;
}
return false; // No need to manually delete[] failure buffer
}
int main()
{
int * buf = nullptr;
GetBuffer(&buf, 100);
}
【问题讨论】:
-
据我所知,
std::unique_ptr在这里没有任何好处。只需首先使用原始指针即可。 -
你读过任何文档吗?我想你想要
std::unique_ptr::release -
@Blastfurnace 是的......我确实没有仔细阅读描述文档。也许我虽然 Release 就像 IUnknown::Release() 所以我没有进一步检查 unique_ptr::release 它是什么。谢谢!
-
我认为该网站上的文档通常清晰直接,这是一个很好的资源,您可能希望将其添加为书签。
标签: c++ pointers smart-pointers