堆/堆栈 - 进入QGraphicsItemGroup的变量范围

时间:2011-06-14 20:20:54

标签: c++ qt qt4 qgraphicsview

如果我有一个QGraphicsItem,我想把它放在一个QGraphicsItemGroup中,在一个循环......就这样:

for(int i =0; i < 2; i++)
{
    for(int j = 0; j < 2; j++)
    {
        QPixmap p(imwidth, imheight);
        p.fill(Qt::gray);
        QGraphicsPixmapItem *ipi = new QGraphicsPixmapItem(p);
        group->addToGroup(ipi);
    }
}

是否有必要将该项放在堆上,或者我可以将其作为堆栈变量并期望它仍然在组中可见,该组在for循环之外声明?

2 个答案:

答案 0 :(得分:3)

addToGroup方法接受一个指针,所以你无法通过它传递任何其他东西。它不会复制传入的对象,只存储指针。

如果你给它一个指向堆栈分配对象的指针,它会迟早试图访问堆栈内存,这将从那时起(可能)被覆盖,即使它(奇迹般地)没有被覆盖,无论如何,这些物体都会被摧毁 - 所以它们在任何情况下都是无效的。

答案 1 :(得分:0)

如果将QGraphicsPixmapItem声明为堆栈变量,则会在循环的每次迭代时对其进行破坏。因此,使用其地址作为QGraphicsItemGroup :: addToGroup方法的指针很可能会导致程序中的分段错误。