Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPointer::clear()是否删除其引用的指针,或者;清除此QPointer对象。”;还有别的意思吗?_C++_Qt_Pointers_Heap_Qpointer - Fatal编程技术网

C++ QPointer::clear()是否删除其引用的指针,或者;清除此QPointer对象。”;还有别的意思吗?

C++ QPointer::clear()是否删除其引用的指针,或者;清除此QPointer对象。”;还有别的意思吗?,c++,qt,pointers,heap,qpointer,C++,Qt,Pointers,Heap,Qpointer,QPointer有一个方法 清除此QPointer对象 我不知道“清楚”到底是什么意思。在我看来,这可能意味着 它删除您引用的指针 或 它取消附加您引用的指针,将该指针留在堆上,并且QPointer对象不再绑定到任何指针 也许是别的意思?您能告诉我它的实际功能吗?QPointer是一个跟踪指针。它跟踪对象的生存期。它不承担任何责任。它永远不会解除分配QObject拥有的任何存储。它可以取消分配底层实现细节——共享引用对象,但这并不影响用户真正关心的任何事情;只有当基础QObject消失并且最后一

QPointer
有一个方法

清除此QPointer对象

我不知道“清楚”到底是什么意思。在我看来,这可能意味着

  • 它删除您引用的指针
  • 它取消附加您引用的指针,将该指针留在堆上,并且
    QPointer
    对象不再绑定到任何指针

  • 也许是别的意思?您能告诉我它的实际功能吗?

    QPointer
    是一个跟踪指针。它跟踪对象的生存期。它不承担任何责任。它永远不会解除分配
    QObject
    拥有的任何存储。它可以取消分配底层实现细节——共享引用对象,但这并不影响用户真正关心的任何事情;只有当基础
    QObject
    消失并且最后一个
    QPointer
    被销毁时,才会解除分配这些对象

    它删除您引用的指针

    那是一种相当令人困惑的语言。指针是值。引用指针具有明确的含义:

    const int *q = ....; // a pointer
    *q; // a pointer dereference (not used for anything)
    
    对我来说,“删除指针”是这样的:

    它取消附加您引用的指针,将该指针留在堆上,并且
    QPointer
    对象不再绑定到任何指针

    确实有很多指针,但那是名副其实的傻瓜。我可能理解你的意思,但这并不意味着任何人都应该这样说:)

    QPointer
    跟踪
    T
    实例的生存期,即对象的生存期。它是对象,而不是指针。因此
    clear()
    使
    QPointer
    不跟踪它跟踪的
    T
    类型的任何对象。这就是全部。这就是在不让每个人怀疑自己是否理智的情况下说的:)

    确实,使
    QPointer
    跟踪对象的方法是通过原始指针指向对象。这就是如何让
    QPointer
    运行的,仅此而已

    QPointer
    与heap混为一谈是不正确的-下面的示例中没有涉及heap,至少没有明确涉及。
    obj
    实例是一个自动变量。实现可以自由地把它放在某种动态存储上——甚至是一个字面堆,但这是C++解释程序的典型,而不是我们通常习惯的:)/P>
    #包括
    int main(){
    QPointer p;
    Q_断言(p.isNull());
    {
    对象对象;
    p=&obj;
    Q_断言(!p.isNull());
    }
    Q_断言(p.isNull());
    }
    
    // dynamically allocate a pointer
    int **p = new int*();
    // make it point somewhere
    int i = {};
    assert(0 == i);
    *p = &i;
    // use it
    **p = 44;
    assert(44 == i);
    // delete it
    delete p; // a pointer-to-integer got deleted
    
    #include <QtCore>
    int main() {
      QPointer<QObject> p;
      Q_ASSERT(p.isNull());
      {
        QObject obj;
        p = &obj;
        Q_ASSERT(!p.isNull());
      }
      Q_ASSERT(p.isNull());
    }