C++ 将unique_ptr转换为void*并返回,是否需要释放?
在我的代码中,我使用一个库,它有一个函数C++ 将unique_ptr转换为void*并返回,是否需要释放?,c++,free,unique-ptr,C++,Free,Unique Ptr,在我的代码中,我使用一个库,它有一个函数store\u pointer接受void*并将其保存在内存中。然后还有另一个函数retrieve\u pointer()将此void*返回给我,我无法控制此库,因此无法更改函数的行为方式 现在,我需要向该函数传递一个变量并返回指针,我将代码设置如下: struct Task { int mId; Task(int id ) :mId(id) { std::cout<<"Task::Constructor
store\u pointer
接受void*
并将其保存在内存中。然后还有另一个函数retrieve\u 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
struct任务
{
int mId;
任务(int id):mId(id)
{
std::cout您正在存储对unique\u ptr的引用:
store_pointer(&taskPtr);
只要不移动taskPtr或不弄乱其内部指针,您就安全了,不需要删除
请注意,如果taskPtr
比用户更早超出范围,则您将有悬空引用
std::unique_ptr taskPtr(新任务(23));
当此变量超出范围时,动态分配将被删除。无需删除,并且除非对唯一指针调用release
,否则您不能自己删除它,这是将所有权从唯一指针转移出去的唯一方法(除了将所有权转移到另一个唯一指针)
您可能执行的任何强制转换对此都没有影响。如果检索指针()
返回您给存储指针的确切指针,则您应该具有“唯一的\u ptr*条=静态\u强制转换(检索指针())什么是store\u pointer
和retrieve\u pointer
?哪里是void*
?John,为了让我们更好地理解您的问题,您需要做一个示例,因为您将retrieve\u pointer
的结果转换为int*
,但这不是您要通过的d到store\u pointer
。如果你不小心的话,这感觉会很快出轨。如果foo
超出范围会发生什么?我选择eerorika答案是因为我觉得它更完整,我希望没有什么不愉快;@JohnSmith你伤了我的心;)。只是开玩笑,当然你应该选择一个适合我的答案最好。这对将来阅读问题的ppl来说很重要。
std::unique_ptr<Task> taskPtr(new Task(23));