将unique_ptr转换为void*并返回,我需要释放吗

Convert unique_ptr to void* and back, do I need to free?

本文关键字:返回 释放 unique ptr 转换 void      更新时间:2023-10-16

在我的代码中,我使用了一个库,它有一个函数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早于用户超出范围,那么您将拥有悬空引用。