Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将unique_ptr转换为void*并返回,是否需要释放?_C++_Free_Unique Ptr - Fatal编程技术网

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));