我实现了大型结构(类似于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;
}
感谢您的回答。
答案 0 :(得分:1)
指向自己的大问题&#34;是你最终得到一个持有最后一个指针的对象。由于此对象没有其他指针,因此无法访问且无法删除。
稍微复杂的变体是两个对象彼此持有指针,但不存在其他指针。两者中的任何一个都会把对方击倒,但是没有办法删除这两个中的第一个。
我不是在谈论聪明或愚蠢的指针,问题是根本的。如果你正在编写垃圾收集算法,你就会知道这是&#34;循环&#34;问题。可以使用图论来表达对象关系,并且通常这些关系是方向性的。 A拥有B,这通常意味着B 不拥有A.但如果确实如此,则您有一个周期A-> B-> A。
回避问题的一种常见方法是使第二图表不包含周期。你说你有一个嵌套的结构。也许父级别可以拥有每个MyStruct
?如果没有唯一的父母可以充当所有者,那么多个父母也许可以使用shared_ptr<myStruct>
来分享所有权 - 仍然处于更高的级别。