如何将unique_ptr移动到原始指针?

时间:2015-10-22 06:49:00

标签: c++ pointers smart-pointers

我有一个用于分配给定大小的缓冲区的函数。在返回之前,缓冲区将预处理/填充一些数据。此预处理可能返回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);
}

2 个答案:

答案 0 :(得分:7)

  

如何将unique_ptr移动到原始指针?

嗯,这是在这里避免使用unique_ptr的任何好处的一种方法。

可以使用std::unique_ptr::release(),但首先使用unique_ptr毫无意义。请考虑返回unique_ptr。这样调用者知道他们拥有指针,当数组停止使用它时将释放它们。否则,您必须记录调用者必须解除分配以及必须如何执行此操作。

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

答案 1 :(得分:5)

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

为了做你想做的事,你需要 在buf上发布呼叫

*ppRetBuf = buf.release();