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

How to move unique_ptr to raw pointer?

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

通常我使用unique_ptr来帮助我自动释放本地分配的对象。在这种情况下,我需要 return 这个分配的对象(由 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);
}

因为ppRetBuf和buf是两种不同的数据类型 编译器为此给出了错误消息。

为了做你想做的事,你需要 在 buf

上调用释放
*ppRetBuf = buf.release();

How to move unique_ptr to raw pointer?

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

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

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