gpt4 book ai didi

c++ - 具有共享指针的列表的共享指针

转载 作者:行者123 更新时间:2023-11-28 04:56:30 25 4
gpt4 key购买 nike

我正在实现大结构(比如结构 A 有结构 B,结构 B 有结构 C,等等……)。在嵌套级别之一中,一个结构具有指向自身的指针。哪种解决方案更适合管理此问题?

struct MyStruct
{
//1st version
std::shared_ptr<std::list<std::shared_ptr<MyStruct>>> myStructPrtList;
//2nd version
std::list<MyStruct*> *myStructPrtList;
};

我知道通过原始指针进行管理必须负责创建和删除对象。智能指针呢?创建这样的列表有什么危险吗?

编辑

这就是这个结构的使用方式:

void createStruct()
{
//Here will be created pointer to main struct
std::shared_ptr<StructA> structA = fillStruct();

//Here get everything what is needed from this struct and this struct wont be used nymore
}

fillStruct 函数:

std::shared_ptr<StructA> fillStruct()
{
std::shared_ptr<StructA> structA = std::make_shared<StructA>();
//Here fill whole structA
//Somewhere create struct B included in struct A
structA->structB = std::make_shared<StructB>();
//Now fill struct B
//and so on...
//Now somewhere in nested struct create MyStruct

//return this whole created struct
return structA;
}

感谢您的回答。

最佳答案

“指向自己的指针”的一个大问题是,您最终可能会得到一个对象,该对象包含指向自身的最后一个指针。由于此对象没有其他指针,因此它不可访问且不可删除。

一个稍微复杂的变体是当两个对象持有一个指向彼此的指针,但不存在指向它们的其他指针时。两者中的任何一个都会将另一个取下,但无法删除两者中的第一个。

我在这里不是在谈论智能指针或哑指针,问题是根本性的。如果您正在编写垃圾收集算法,您就会知道这是“循环”问题。对象关系可以用图论来表示,通常这些关系是有方向的。 A 拥有 B,这通常意味着 B 拥有 A。但如果拥有,则循环 A->B->A。

回避该问题的一种常见方法是使用包含循环的第二图。你说你有一个嵌套结构。也许父级别可以拥有每个 MyStruct ?如果没有唯一的 parent 可以充当所有者,多个 parent 也许可以使用 shared_ptr<myStruct>共享所有权 - 仍处于较高水平。

关于c++ - 具有共享指针的列表的共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47013755/

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