【发布时间】:2017-10-30 11:08:00
【问题描述】:
我正在实现大型结构(结构 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;
}
感谢您的回答。
【问题讨论】:
-
如果您不解释您打算使用的生命周期管理/要求,我认为无法回答这个问题,通过思考,您可能会回答您自己的问题。
-
如果对性能要求不高,我总是更喜欢第一个版本而不是第二个版本。如果可以自动为您完成,您为什么要自己管理内存。另外,您确定要使用
std::list而不是std::vector? -
@Timo:
shared_ptr不是一个成熟的垃圾收集。它不能进行自省,不能检测循环,因此不能打破循环。 -
std::shared_ptr<std::list<T>>很少是你想要的,std::list<T>或std::list<std::shared_ptr<T>>更常见。
标签: c++ smart-pointers