c++ - 这安全吗? (qt QQueue.dequeue() c++ 内联指针取消引用)

标签 c++ qt pointers queue

Object object = *(queue.dequeue());

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

最佳答案

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

您的代码所做的只是对 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++ - 这安全吗? (qt QQueue.dequeue() c++ 内联指针取消引用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330705/

相关文章:

C++ stoi 超出范围问题

c++ - 一个什么都不做的函数可以改变一个对象吗?

c++ - 类初始化的 const 引用

链表段错误的C++数组

c - 如何在结构中正确使用指针数组

c++ - gfortran makefile 问题

c++ - opencv 图像重新缩放错误的偏移量

c++ - Qt:keyPressEvent 中的打印屏幕键

c++ - 在 ResizeToContents 模式下调整大小时,QHeaderView 仅考虑当前屏幕上的项目

c++ - 链表 - 指针