我有一个函数,用于分配给定大小的缓冲区。在返回之前,缓冲区将被预处理/填充一些数据。这个预处理可能会返回false来表示该缓冲区未被正确处理。因此,我想在这个缓冲区上应用RAII以避免提前返回而不删除它。
通常情况下,我使用unique_ptr来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(由unique_ptr拥有),并将所有权转移给调用者。但是编译器抱怨我无法将unique_ptr转换为T*,同时我std::move了unique_ptr。看起来unique_ptr只能移动到另一个unique_ptr中,而不能移动到裸指针中。
有没有办法将所有权从unique_ptr转移到原始指针?还是说unique_ptr不适用于这种情况?
通常情况下,我使用unique_ptr来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(由unique_ptr拥有),并将所有权转移给调用者。但是编译器抱怨我无法将unique_ptr转换为T*,同时我std::move了unique_ptr。看起来unique_ptr只能移动到另一个unique_ptr中,而不能移动到裸指针中。
有没有办法将所有权从unique_ptr转移到原始指针?还是说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