How to move unique_ptr to raw pointer?(如何将UNIQUE_PTR移动到原始指针?)
问题描述
我有一个函数,用于分配给定大小的缓冲区。缓冲区将在返回之前对一些数据进行预处理/填充。此预处理可能返回FALSE,以表示此缓冲区未正确处理。因此,我要对此缓冲区应用RAII,以避免在没有delete[]
它的情况下提前返回。
通常我使用unique_ptr
来帮助我自动释放本地分配的对象。在这种情况下,我需要返回这个分配的对象(归unique_ptr
所有),并将所有权转移给调用者。但编译器抱怨说,当我std::move
unique_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
根本没有用,除非您正在执行的操作可能会在构造数组和返回数组之间抛出,并为简单起见将其省略。
这篇关于如何将UNIQUE_PTR移动到原始指针?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将UNIQUE_PTR移动到原始指针?
基础教程推荐
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 设计字符串本地化的最佳方法 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01