假设一个类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_ptr
到this
,因为我们不知道存储了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/