gpt4 book ai didi

c++ - 从指向的对象中重新分配 shared_ptr

转载 作者:行者123 更新时间:2023-11-30 05:39:14 25 4
gpt4 key购买 nike

<分区>

考虑下面的代码

struct base {
virtual void bar(std::shared_ptr<base>&) = 0;
};

struct foo1 : base { /* ... */ };

struct foo2 : base {
void bar(std::shared_ptr<base>&obj)
{
// ...
if(some_condition)
obj = std::make_shared<foo1>(); // re-assign obj
// ...
}
};

std::shared_ptr<base> x = std::make_shared<foo2>();
x->bar(x); // last line

此代码会调用 UB 吗? (注意:当从最后一行调用时,obj 的重新分配将破坏调用 foo2::barthis 对象)。如果此后没有bar的数据被访问,代码还可以吗?

另一种编码方式是

struct base {
virtual std::shared_ptr<base> bar(std::shared_ptr<base>) = 0;
};
struct foo1 : base { /* ... */ };

struct foo2 : base {
std::shared_ptr<base> bar(std::shared_ptr<base> obj)
{
// ...
if(some_condition)
obj = std::make_shared<foo1>();
// ...
return obj;
}
};

std::shared_ptr<base> x = std::make_shared<foo2>();
x=x->bar(x);

在任何情况下哪个应该是安全的,不是吗?此代码中的额外复制是性能问题吗?


编辑。克里斯回答后,我看了看shared_from_this ,它允许以下替代实现

struct base : std::enable_shared_from_this<base> {
virtual std::shared_ptr<base> bar() = 0;
};
struct foo1 : base { /* ... */ };

struct foo2 : base {
std::shared_ptr<base> bar()
{
auto obj = shared_from_this();
if(some_condition)
obj = std::make_shared<foo1>();
// ...
return obj;
}
};

std::shared_ptr<base> x = std::make_shared<foo2>();
x=x->bar();

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