具有共享指针的列表的共享指针

Shared pointer of list with shared pointers

我正在实现大结构(比如结构 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;
}

感谢您的回答。

"pointers to yourself" 的最大问题是您最终可能会得到一个 object,它包含指向自身的最后一个指针。由于此 object 没有其他指针,因此无法访问且无法删除。

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

我在这里不是在谈论智能指针或哑指针,问题是根本性的。如果您正在编写垃圾收集算法,您就会知道这是 "cycle" 问题。 Object 关系可以用图论来表达,一般来说这些关系是有向的。 A 拥有 B,这通常意味着 B 确实 而不是 拥有 A。但如果它拥有,则您有一个循环 A->B->A。

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