如何将unique_ptr移动到原始指针
How to move unique_ptr to raw pointer?
我有一个函数,用于分配给定大小的缓冲区。缓冲区将在返回之前预处理/填充一些数据。此预处理可能返回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);
}
如何移动unique_ptr到原始指针?
这是避免使用unique_ptr的好处的一种方法。
你可以使用std::unique_ptr::release()
,但unique_ptr
的使用首先是毫无意义的。考虑返回一个unique_ptr
。这样调用者就知道他们拥有指针,当他们停止使用指针时,数组将被释放。否则,您必须记录调用者必须释放内存以及他们必须如何执行该操作。
如果这不是一个选项,那么unique_ptr
根本没有用,除非您正在做一些可能在构造数组和返回数组之间发生的事情,并为简单起见将其省略。
因为pprebuf和buf是两种不同的数据类型编译器会给出错误信息。
为了做你想做的事,你需要调用buf
释放*ppRetBuf = buf.release();
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 如何在C++中将 std::vector 移动到原始数组中
- 在保持原始对象的同时移动
- 将原始指针移动到已创建函数中的下一个字符
- 在原始对象上使用惯用(例如 TBB 的 thread_enumerable_specific')移动赋值调用析构函数
- 在Qt中获取原始鼠标移动
- 移动是否分配了 std::fstream 关闭原始流
- 对容器进行排序,然后在保留原始排序的情况下移动元素
- 如何将unique_ptr移动到原始指针
- 将原始指针内容移动到vector
- 将列表框中的项移动到其原始位置
- 自动生成移动操作和原始指针成员