2016-03-28 2 views
-1
//Case 1: 
QImage* tImg = new QImage("Some Image Here"); 
painter->drawImage(x, y, *tImg); 
... 
delete tImg; 

//Case 2: 
QImage* tImg = new QImage("Some Image Here"); 
{ 
    QImage aImg(*tImg); 
    painter->drawImage(x, y, aImg); 
} 
... 
delete tImg; 

QImage неявно разделяют, когда что-то (как aImg) получить «общую копию» исходных данных, что произойдет, если удалить исходные данные, будет aImg по-прежнему сохраняют данные?Qt, неявный общий объект, что происходит при удалении?

А что произойдет с случаем 1, будет drawImage создать общую копию?

ответ

2

Неявное совместное использование в Qt следует парадигме CoW (copy on write) - объекты будут неявно использовать один и тот же внутренний ресурс, если он не изменяется, если некоторые из копий пытаются изменить ресурс, он будет «отсоединен» «из общего ресурса, скопируйте его и примените к нему изменения.

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

В случае 1 общий ресурс будет удален, так как больше нет объектов, ссылающихся на него.

В случае 2 он также будет удален, так как aImg будет недоступен к тому времени, когда tImg удаляется.

+0

Будет ли возникнут какие-либо проблемы с функцией drawImage()? так как он принимает в качестве входного сигнала (const QImage & image). Можно ли удалить ссылку QImage после вызова drawImage()? – Nyaruko

+1

'drawImage()' не будет изменять изображение, поэтому он останется ссылкой на общий ресурс. Нет проблем с его удалением, так как сама операция рисования копирует значения пикселей в целевое устройство рисования. Устройство рисования не будет ссылаться на данные изображения, но даже если бы оно и использовалось, и оно использовало CoW, данные оставались бы живыми до тех пор, пока это необходимо. – dtech

+0

Является ли копия значений пикселей мгновенно? Если 'delete tImg' находится в другом потоке (но я использую мьютекс, чтобы убедиться, что' delete tImg' вызывается после вызова 'drawImage()'), будет ли он по-прежнему безопасным? – Nyaruko

Смежные вопросы