代码之家  ›  专栏  ›  技术社区  ›  drewpol

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

  •  0
  • drewpol  · 技术社区  · 7 年前

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

    谢谢你的回答。

    1 回复  |  直到 7 年前
        1
  •  1
  •   MSalters    7 年前

    “指向您自己的指针”的最大问题是,您最终可能会得到一个对象,该对象将最后一个指针指向自身。因为这个对象没有其他指针,所以它是不可访问和不可删除的。

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

    拥有A。但如果有,你有一个循环A->B->A.

    回避这个问题的一种常见方法是 第二 确实如此的图形 包含循环。你说你有一个嵌套结构。也许父级可以拥有每个 MyStruct ? 如果没有唯一的父母可以作为所有者,多个父母也许可以使用 shared_ptr<myStruct> 分享所有权——仍然处于更高的水平。