c++ - 在没有其他智能指针的情况下创建weak_ptr

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

假设一个类A和一个类B。类A的每个实例都拥有0到N个类B的实例。删除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实例在使用前是否尚未释放?创建child时如何返回“安全”指针?谢谢。

最佳答案

在您的代码中,父对象拥有所有子对象,并且在调用父对象的析构函数后将销毁它们。因此,如果在父级销毁后(可能在另一个线程中)发生了子级方法仍在执行的情况,则子级实例已经无效,并且您无法做任何安全的事情来检测这种情况。

为了避免父对象的“过早死亡”,您可以在子类中引入互斥锁来同步线程,如下所示:

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 ++运行时可以不要那样做。

关于c++ - 在没有其他智能指针的情况下创建weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178587/

相关文章:

c++ - 如何在 MPI 中传递 std::unique_ptr?

c++ - "making"unique_ptr<T> 隐式转换为 T* 的陷阱?

c++ - 智能指针的优缺点

c++ - 将 shared_ptr 与指向指针的指针一起使用时出现编译器错误

c++ - 未解析的外部符号

C++ % 运算符在这里做什么?

c++ - 当按钮按下时间较长时,Windows 会变暗

c++ - 向/从二进制文件写入/读取 std::set< T >

c++ - 使用 std::enable_shared_from_this 时析构函数崩溃

c++ - 计算存在的 shared_ptr 数