【问题标题】:is this safe? (qt QQueue.dequeue() c++ inline pointer dereference)这安全吗? (qt QQueue.dequeue() c++ 内联指针解引用)
【发布时间】:2011-11-30 18:05:28
【问题描述】:
Object object = *(queue.dequeue());

queue 是一个 QQueue。我担心出队的指针在取消引用之前会被删除。当然我可以访问object 的数据,但这并不意味着什么。像这样在一行中完成所有操作很方便(我不想要指针,因为我希望object 在超出范围时自动删除)但是如果它不安全,那么我就不能这样做。请指教。谢谢。

【问题讨论】:

    标签: c++ qt pointers queue


    【解决方案1】:

    它本身并不是立即不安全,但你可能会错误地使用它

    您的代码所做的只是对queue 的最后一个元素所指向的元素进行复制。通过使元素出队,您会丢失指向它的指针,并且您现在无法释放该原始对象以防它是动态构造的。

    正确示例(没有动态对象,没有泄漏):

    QQueue<Foo*> q;
    
    {
      Foo a;
      q.enqueue(&a);
      Foo b = *q.dequeue();
    }
    

    破例(动态对象泄露):

    QQueue<Foo*> q;
    q.enqueue(new Foo);   // eeew, naked "new" in C++...
    Foo c = *q.dequeue();
    // now the newed element is leaked
    

    你是对的,c 在其作用域的末尾被安全地销毁,但是你正在泄漏原始的、新的对象,你现在没有指针或引用。

    【讨论】:

    • 非常感谢您的澄清。不知道在 C++ 中指向对象取消引用操作的指针中隐含了一个副本。我认为我的困惑源于多年前在 perl 中的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多