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

2022-08-26 00:00:00 pointers c++ smart-pointers

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

通常我使用unique_ptr来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(归unique_ptr所有),并将所有权转移给调用者。但编译器抱怨说,当我std::moveunique_ptr时,我无法将unique_ptr<T[]>转换为T*。看起来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);
}

解决方案

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

好的,这是避免在这里使用UNIQUE_PTR的任何好处的一种方式。

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

如果这不是一个选项,则unique_ptr根本没有用,除非您正在执行的操作可能会在构造数组和返回数组之间抛出,并为简单起见将其省略。

相关文章