2016-10-21 9 views
0

クラスAとクラスBをクラスAの各インスタンスはクラスBの0〜N個のインスタンスから所有します。Aのインスタンスが削除されると、Bのインスタンスも削除されます。例えば別のスマートポインタを持たないweak_ptrの作成

は:shared_ptr<parent>を有する

class parent 
{ 
private: 

    vector< unique_ptr<child> > m_children; 

public: 

    weak_ptr<child> create_child() 
    { 
     m_children.push_back(move(make_unique<child>(???))); 
     return m_children.back(); 
    } 
}; 

class child 
{ 
private: 

    weak_ptr<parent> m_parent; 

public: 

    child(weak_ptr<parent> parent) : m_parent(parent) { } 
}; 

一つは、可能性は、手動でそのポインタを使用してchildを作成しました。しかし、クラスparentの範囲内では、であり、shared_ptrthisではないため、parentインスタンスが格納されていることがわからないため、このshared_ptrのうちweak_ptrを作成することはできません。持っている。

私の質問は:childクラススコープ内で、parentインスタンスが使用前に解放されていないことを確認するにはどうすればよいですか? childを作成するときに「安全な」ポインタを返すにはどうすればよいですか?ありがとうございました。

+3

あなたは 'shared_ptr'から' unique_ptr'から 'weak_ptr'を得ることはできません。 –

+2

あなたはおそらく['std :: enable_shared_from_this'](http://en.cppreference.com/w/cpp/memory/enable_shared_from_this)を探しています。 – Quentin

+0

@Quentinそれは私が必要としているようですが、私が読んだことによると、親はshared_ptrに格納する必要があります。クラスのユーザーは、文書に記載されていてもそれを忘れるかもしれません。なぜなら、それに対して強力な保護がないからです。私が理解していないことがない限り、私には少し安全ではないようです。 – Virus721

答えて

-1

あなたのコードでは、親オブジェクトはすべての子を所有しており、親のデストラクタが呼び出された後に破棄されます。したがって、親が破棄された後(おそらく別のスレッドで)、子プロセスがまだ実行されている場合、子インスタンスはすでに無効であり、この状況を検出するために安全な操作はできません。親オブジェクトの「早すぎる死」を回避するために

、あなたはそのようなスレッド、同期させるために子クラスにミューテックスを導入することができます。しかし

class child 
{ 
private: 
    std::mutex m_mutex; 
    bool m_stopflag = false; 
public: 
    void execute() { 
    std::unique_lock<std::mutex> lock (m_mutex); 
    while (!m_stopflag) { 
     //doing something   
    } 
    } 

    ~child() { 
    m_stopflag = true; 
    m_mutex.lock(); 
    m_mutex.unlock(); 
    } 
} 

を、あなたの問題についての私の推測が間違っている場合あなたの質問は本当にスレッドを止めることではなく、すでに破壊された '子'オブジェクトのメソッドの呼び出しに対して何らかの保護を達成することについて、おそらく何も提案できません.C++ランタイムはそれを行うことはできません。

関連する問題