将unique_ptr转换为void*并返回,我需要释放吗
Convert unique_ptr to void* and back, do I need to free?
在我的代码中,我使用了一个库,它有一个函数store_pointer
,接受void*
并将其保存在内存中。然后还有另一个函数retrieve_pointer()
将这个void *
返回给我,我无法控制这个库,所以我无法更改函数的行为方式。
现在我需要将一个变量传递给这个函数并取回指针,我的代码设置如下:
struct Task
{
int mId;
Task(int id ) :mId(id)
{
std::cout<<"Task::Constructor"<<std::endl;
}
~Task()
{
std::cout<<"Task::Destructor"<<std::endl;
}
};
std::unique_ptr<Task> taskPtr(new Task(23));
store_pointer(&taskPtr);
// do stuff that doesn't involve taskPtr
Task *new_taskPtr = reinterpret_cast<Task *>(retrieve_pointer());
// do stuff with new_taskPtr pointer
现在这一切都可以,但我想知道*new_taskPtr
指针是否需要删除,或者reinterpret_cast
是否将指针"恢复"到unique_ptr
,因此当内存超出范围/程序结束时,内存将自动删除。
std::unique_ptr<Task> taskPtr(new Task(23));
当此变量超出范围时,动态分配将被删除。没有必要,也不能自己删除它,除非您对唯一指针调用release
,这是将所有权从唯一指针转移出去的唯一方法(除了将所有权转移到另一个唯一指针之外(。
你可能做的任何造型对此都没有影响。
您正在存储对unique_ptr:的引用
store_pointer(&taskPtr);
只要你不移动taskPtr或不干扰它的内部指针,你就安全了,不需要delete
。
请注意,如果taskPtr
早于用户超出范围,那么您将拥有悬空引用。
相关文章:
- C++ 返回异常,我应该释放资源吗?
- 将unique_ptr转换为void*并返回,我需要释放吗
- 在函数内部错误定位后,从函数中释放返回的指针会导致芯片崩溃
- 如何正确释放返回值
- 动态使用返回的数组,如何释放其内存
- C++返回static_cast指针导致的双重释放<Base>
- ::运算符 delete(指针) 返回释放的字节大小
- 当我通过删除临时节点来释放内存时,我会得到读取访问违规行为.但是只有当我返回错误语句时
- 即使在返回值之前释放后,数据仍在指针中仍然存在
- 释放在返回指向该内存的指针的函数中分配的内存 (C++)
- 谁需要释放返回char*的系统调用的内存
- 我是否负责释放/删除stringstream.str()返回的字符串
- 释放返回值/指向CvMat的指针的内存
- 大返回值(如字符串)的内存释放如何在C++中发生
- 是否应该释放 CreateEvent 返回的句柄
- 在函数中定义一个动态数组,然后返回数组元素。如何释放阵列的内存?
- 释放从函数返回的char*
- 是否可以在释放"legally"后通过反复"new"来重用指针,直到再次返回相同的地址?
- Objective-C:如果我在ARC的函数中返回一个c++对象,它会创建一个副本吗?我是否必须手动释放该副本?
- 当程序关闭(不从main返回)时,windows会自动释放内存吗?