Qt如何处理悬空指针- QPointer
在日常搬砖工作中,可能会遇到这样的情况:
class Test{
public:
void setPtr(QObject *ptr){m_ptr = ptr;}
bool isPtrValid(){return m_ptr != nullptr;}
private:
QObject *m_ptr;
}
int main(int argc,char **argv){
QObject *obj = new QObject();
Test test;
test.setPtr(obj);
delete obj;
obj = nullptr;
test.isPtrValid();
}
很明显,test.isPtrValid()返回ture,如果这个时候操作了m_ptr,那么程序就崩溃了,这就是典型的悬空指针问题,如何处理这个问题呢?
有两种方式:
1、在Test中接收QObject的destroyed的信号,并在槽函数中将m_ptr=nullptr。后面使用的时候再判断m_ptr是否为空即可。
2、还有一种就是将m_ptr声明为QPointer,其他程序不用变,将判断为空的地方改为m_ptr.isNull()即可。当外部的指针被释放时,m_ptr中的指针也会变为nullptr。qt内部使用了QWeakPointer处理。