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

Che*_* OT 5 c++ pointers smart-pointers

我有一个函数,用于分配给定大小的缓冲区.在返回之前,缓冲区将预处理/填充一些数据.此预处理可能返回false以表示此缓冲区未正确处理.所以我想在这个缓冲区上应用RAII,以避免在没有delete[]它的情况下提前返回.

通常我unique_ptr用来帮助我自动释放本地分配的对象.在这种情况下,我需要返回此分配的对象(拥有者unique_ptr)并将所有权转移给调用者.但是,编译器会抱怨,我不能转换unique_ptr<T[]>T*,而我std::moveunique_ptr.它看起来unique_ptr只能移动到另一个unique_ptr而不是原始指针.

有没有办法将所有权转移unique_ptrraw 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);
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 8

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

那么,这是避免在这里使用unique_ptr的任何好处的一种方法.

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

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

  • 与发布结合使用“unique_ptr”并不是毫无意义的。您可能正在处理需要原始指针的外部代码。然后您可以在构建这些对象期间使用“unique_ptr”。如果在将异常传递给外部代码之前抛出任何异常,则该对象仍然会被删除。 (2认同)

And*_*rsK 5

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

为了做你想做的事,你需要在buf上调用release

*ppRetBuf = buf.release();
Run Code Online (Sandbox Code Playgroud)