在没有另一个智能指针的情况下创建weak_ptr

时间:2016-10-21 13:57:35

标签: c++ shared-ptr smart-pointers weak-ptr

让A类和B类.A类的每个实例都拥有B类的0到N个实例。当删除A的实例时,也会删除B的实例。

例如:

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 ) { }
};

有人可以,shared_ptr< parent >使用该指针手动创建child。但是,在班级parent的范围内,我们只有this,而不是shared_ptrthis,因为我们不知道parent个实例存储,因此我们无法创建我们没有的weak_ptr shared_ptr

所以我的问题是:如何在child类范围内检查parent实例在使用之前是否尚未发布?我怎样才能退回&#34; safe&#34;创建child时的指针?谢谢。

1 个答案:

答案 0 :(得分:-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 ++运行时无法做到这一点。