2011-06-14 29 views
0

如果我有,我想提出一个QGraphicsItemGroup一个的QGraphicsItem,在loop..like这样:堆/堆栈 - 变量的作用域进入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循环之外声明的?

回答

3

addToGroup方法需要一个指针,所以你不能随便传递任何东西而逃脱。它不会复制传入的对象,只是存储该指针。

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

0

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