Heap/Stack — область действия переменных, входящих в QGraphicsItemGroup

Если у меня есть 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?


person Derek    schedule 14.06.2011    source источник


Ответы (2)


Метод addToGroup принимает указатель, поэтому передавая это что-нибудь еще. Он не копирует переданные объекты, а просто сохраняет этот указатель.

Если вы дадите ему указатель на объекты, размещенные в стеке, он рано или поздно взорвется, пытаясь получить доступ к памяти стека, которая (вероятно) была перезаписана с тех пор, и даже если она (чудесным образом) не была перезаписана, эти объекты все равно будут уничтожены - так что они в любом случае будут недействительны.

person Mat    schedule 14.06.2011

Если вы объявите свой QGraphicsPixmapItem как переменную стека, он будет уничтожен на каждой итерации цикла. Следовательно, использование его адреса в качестве указателя для метода QGraphicsItemGroup::addToGroup, скорее всего, приведет к ошибке сегментации позже в программе.

person Mr_Hic-up    schedule 14.06.2011