2015-10-22 63 views
3

我有一个函数用于分配给定大小的缓冲区。缓冲区将在返回之前进行预处理/填充一些数据。此预处理可能返回false以表示此缓冲区未处理正确。所以我想在这个缓冲区上应用RAII来避免没有delete[]它提前返回它。如何将unique_ptr移动到原始指针?

通常我用unique_ptr来帮我自动释放本地分配的对象。在这种情况下,我需要返回此分配的对象(由unique_ptr拥有)和将所有权转让给调用者。但编译器抱怨我无法将unique_ptr<T[]>转换为T*,而我std::moveunique_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); 
} 
+1

据我所见,'std :: unique_ptr'在这里没有任何好处。然后,首先使用原始指针。 –

+6

你有没有读过任何文档?我想你想['std :: unique_ptr :: release'](http://en.cppreference.com/w/cpp/memory/unique_ptr/release) – Blastfurnace

+0

@Blastfurnace是啊...我没有阅读说明文档确实小心。也许我虽然释放就像IUnknown :: Release(),所以我没有进一步检查unique_ptr :: release是什么。谢谢! –

回答

6

如何的unique_ptr移到原始指针?

那么,这是避免在这里使用unique_ptr的好处之一。

可以使用std::unique_ptr::release()但是然后使用unique_ptr是首先没有意义的。考虑返回unique_ptr。这样调用者就知道他们拥有指针,并且数组在停止使用时将被释放。否则,你必须记录调用者必须释放以及他们必须如何去做。

如果这不是一个选项,那么根本就没有用unique_ptr,除非你正在做一些可能在构造数组和返回数据之间抛出的东西,并且为了简单起见而将它抛出。

5

由于ppRetBuf和BUF是 ,编译器提供错误消息为两个不同的数据类型。

为了做你想要做什么,你需要 呼叫释放的BUF

*ppRetBuf = buf.release(); 
相关问题