将 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,这是将所有权从唯一指针转移出来的唯一方法(除了将所有权转移到另一个唯一指针) .

您可能执行的任何转换对此都没有影响。