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

时间:2017-10-30 11:08:00

标签: c++ smart-pointers

我实现了大型结构(类似于struct 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 个答案:

答案 0 :(得分:1)

指向自己的大问题&#34;是你最终得到一个持有最后一个指针的对象。由于此对象没有其他指针,因此无法访问且无法删除。

稍微复杂的变体是两个对象彼此持有指针,但不存在其他指针。两者中的任何一个都会把对方击倒,但是没有办法删除这两个中的第一个。

我不是在谈论聪明或愚蠢的指针,问题是根本的。如果你正在编写垃圾收集算法,你就会知道这是&#34;循环&#34;问题。可以使用图论来表达对象关系,并且通常这些关系是方向性的。 A拥有B,这通常意味着B 拥有A.但如果确实如此,则您有一个周期A-> B-> A。

回避问题的一种常见方法是使第二图表包含周期。你说你有一个嵌套的结构。也许父级别可以拥有每个MyStruct?如果没有唯一的父母可以充当所有者,那么多个父母也许可以使用shared_ptr<myStruct>来分享所有权 - 仍然处于更高的级别。