将 unique_ptr 转换为 void* 并返回,我需要释放吗?
Convert unique_ptr to void* and back, do I need to free?
在我的代码中,我使用了一个函数库 store_pointer
接受 void*
并将其保存在内存中。然后还有另一个函数 retrieve_pointer()
returns 这个 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
"restores" 指向 unique_ptr
的指针是否需要删除等等scope/the程序结束时内存会自动删除
您正在存储对 unique_ptr 的引用:
store_pointer(&taskPtr);
只要你不移动 taskPtr 或不弄乱它的内部指针,你就是安全的,不需要 delete
。
请注意,如果 taskPtr
早于用户超出范围,您将拥有悬空引用。
std::unique_ptr<Task> taskPtr(new Task(23));
当这个变量超出范围时,动态分配将被删除。没有必要,你也不能自己删除它,除非你在唯一指针上调用 release
,这是将所有权从唯一指针转移出来的唯一方法(除了将所有权转移到另一个唯一指针) .
您可能执行的任何转换对此都没有影响。
在我的代码中,我使用了一个函数库 store_pointer
接受 void*
并将其保存在内存中。然后还有另一个函数 retrieve_pointer()
returns 这个 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
"restores" 指向 unique_ptr
的指针是否需要删除等等scope/the程序结束时内存会自动删除
您正在存储对 unique_ptr 的引用:
store_pointer(&taskPtr);
只要你不移动 taskPtr 或不弄乱它的内部指针,你就是安全的,不需要 delete
。
请注意,如果 taskPtr
早于用户超出范围,您将拥有悬空引用。
std::unique_ptr<Task> taskPtr(new Task(23));
当这个变量超出范围时,动态分配将被删除。没有必要,你也不能自己删除它,除非你在唯一指针上调用 release
,这是将所有权从唯一指针转移出来的唯一方法(除了将所有权转移到另一个唯一指针) .
您可能执行的任何转换对此都没有影响。