我有一个函数用于分配给定大小的缓冲区。缓冲区将在返回之前进行预处理/填充一些数据。此预处理可能返回false以表示此缓冲区未处理正确。所以我想在这个缓冲区上应用RAII来避免没有delete[]
它提前返回它。如何将unique_ptr移动到原始指针?
通常我用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'](http://en.cppreference.com/w/cpp/memory/unique_ptr/release) – Blastfurnace
@Blastfurnace是啊...我没有阅读说明文档确实小心。也许我虽然释放就像IUnknown :: Release(),所以我没有进一步检查unique_ptr :: release是什么。谢谢! –