【问题标题】:Is this the corrected way to use QPointer?这是使用 QPointer 的正确方法吗?
【发布时间】:2014-12-11 19:03:31
【问题描述】:

如何检查指针的内容是否被删除?如果我像这样使用 QPointer:

myClass::myClass(myStruct* p){
 _p = p;//_p is a QPointer<myStruct>
}

myClass::function(){
if(_p) {_p->function();}
}

那我有

myStruct* p = new myStruct();
myClass A(p);
delete p;
A.function();

最后一个 A.function() 是否会导致 _p->function() 被调用并因此导致访问冲突?当我删除 p 时,_p 会发生什么?

【问题讨论】:

  • 使用常规指针无法检查,请参阅QSharedPointerQWeakPointer
  • 但是 QPointer 的文档说一旦删除它就会被强制转换为 0?
  • @ddriver 我看错了吗? QObject 析构函数将清除所有指向它的QPointers。
  • @hyde - 是的,你是对的。我的错。但它仅适用于派生的QObject

标签: c++ qt qpointer


【解决方案1】:

如果myStructQObject 的子类,那么您的代码应该可以工作,正如从显示的sn-ps 中所说的那样。 QObject 析构函数将清除每个指向被破坏实例的QPointer。如果它不是QObject 子类,那么你应该得到编译/链接错误。

引用自docs

注意类T必须继承QObject,否则编译或链接错误 会有结果的。

【讨论】:

  • 但是 QPointer 什么时候设置回 NULL?一旦 delete p 被调用,它是否立即设置回 NULL(假设 delete p 和 QPointer 在同一个线程中)?如果有另一个线程发出信号来触发 myClass::function(),我的问题中的示例仍然安全吗?
  • 在 C++ 中,没有垃圾回收,delete 将导致对象析构函数被立即以相反的顺序调用,所以QObject::~QObject 是最后一个被调用的析构函数,但它会被调用在delete“返回”之前。如果你使用线程间信号,它们应该被排队,所以删除对象应该不是问题。
  • @Nyaruko 如果在删除对象时调用从另一个线程中删除的对象的任何方法(或执行任何其他非显式线程安全的操作),无论是直接方法调用,还是通过 @ 987654330@ 信号,这基本上是你程序中的一个错误。
猜你喜欢
  • 2012-05-11
  • 2018-12-31
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
  • 2017-02-01
相关资源
最近更新 更多