2017-10-30 14 views
0

私は大きな構造体を実装しています(構造体Aに構造体Bがあり、構造体Bに構造体Cなどがあります)。いずれかのネストされたレベルでは、1つの構造体にはそれ自身へのポインタがあります。これでどのソリューションを管理するのが良いでしょうか?共有ポインタを持つリストの共有ポインタ

struct MyStruct 
{ 
    //1st version 
    std::shared_ptr<std::list<std::shared_ptr<MyStruct>>> myStructPrtList; 
    //2nd version 
    std::list<MyStruct*> *myStructPrtList; 
}; 

ローポインタによる管理では、オブジェクトの作成と削除が必要です。スマートポインタはどうですか?そのようなリストを作成すると危険ですか?

EDIT

これは、この構造体が使用される方法です。

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

これは、あなたが使用しようとしている生涯管理/要件を説明することなく答えられるとは思えません。それについて考えると、おそらくあなた自身の質問に答えるでしょう。 –

+0

パフォーマンスが重大ではない場合、私は常に第1版を第2版より優先します。自動的にあなたのために行うことができる場合、あなたはなぜ自分自身を管理しますか? また、 'std :: vector'よりも' std :: list'を使いたいのですか? – Timo

+0

@Timo: 'shared_ptr'は本格的なガベージコレクションではありません。それはイントロスペクションを行うことはできず、サイクルを検出できないため、サイクルを中断することはできません。 – MSalters

答えて

1

「自分自身へのポインタ」の大きな問題は、最後のポインタを保持しているオブジェクトで終わることができることです。このオブジェクトには他のポインタはないため、到達不能で削除不能です。

もう少し複雑な変形は、2つのオブジェクトが互いにポインタを保持しているが、他のポインタが存在しない場合です。 2人のうちのどちらかがもう一方の人を奪うだろうが、2人のうちの最初の人を削除する方法はない。

私はここでスマートまたはダムポインタについて話していません、問題は基本的です。ガベージコレクションアルゴリズムを書いている場合は、これを「サイクル」問題として認識します。オブジェクト関係は、グラフ理論を用いて表現することができ、一般に、これらの関係は指向的である。 AはBを所有しており、それは通常Bがではなく、がAであることを意味します。しかしそうであれば、A→B→Aのサイクルがあります。問題を回避するために

1つの一般的なアプローチはがないのサイクルを含んでいますグラフを持つことです。あなたはネストされた構造を持っていると言います。おそらく、親レベルはすべてMyStructを所有する可能性がありますか?また、所有者として行動できる固有の親がない場合、複数の親がshared_ptr<myStruct>を使用して所有権を共有することができます。

関連する問題