gpt4 book ai didi

c++ - 在不传递所有权的情况下重新分配函数中的智能指针?

转载 作者:行者123 更新时间:2023-11-30 01:34:47 24 4
gpt4 key购买 nike

背景

使用普通指针,我可以做类似下面的事情

void conditional_reassign(MyClass* ptr)
{
if (my_condition)
{
delete ptr;
ptr = new MyClass(new_param);
}
}

我可以传入我想要改变的指针,如下所示

MyClass* ptr = new MyClass(old_param);
conditional_reassign(ptr);

我希望用 std::unique_ptr 重新实现它。这是我想出的

std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr)
{
if (my_condition)
{
ptr = std::make_unique<MyClass>(new_param);
}
return std::move(ptr);
}

我会这样调用它

std::unique_ptr<MyClass> ptr = make_unique<MyClass>(old_param);
ptr = std::move(conditional_reassign2(std::move(ptr)));

问题

我对这行的冗长不太满意

ptr = conditional_reassign2(std::move(ptr));

有没有办法实现 conditional_reassign2 以便我可以用类似于 conditional_reassign(ptr) 的方式调用它

编辑

我应该注意到一个主要问题

ptr = std::move(conditional_reassign2(std::move(ptr)));

无论my_condition如何,它都会破坏指向的原始对象ptr(参见Why does reassigning a smart pointer to itself cause destruction?)

最佳答案

要么你需要通过引用传递指针

void conditional_reassign2(std::unique_ptr<MyClass>& ptr) {...}

std::unique_ptr<MyClass> myPtr;
conditional_reassign2(myPtr);

或者返回指针,需要一步操作

std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr) {...}

std::unique_ptr<MyClass> myPtr;
myPtr = conditional_reassign2(std::move(myPtr));

您也可以直接从函数返回 ptr 而无需显式调用 move。

std::unique_ptr<MyClass> conditional_reassign2(std::unique_ptr<MyClass> ptr)
{
if (my_condition)
ptr = std::make_unique<MyClass>(new_param);
return ptr;
}

关于c++ - 在不传递所有权的情况下重新分配函数中的智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55629330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com