Qt,隐式共享对象,删除会发生什么?

时间:2016-03-28 16:26:03

标签: c++ qt

//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是否仍会保留数据?

案例1会发生什么,drawImage会创建一个共享副本吗?

1 个答案:

答案 0 :(得分:2)

Qt中的隐式共享遵循CoW(写入时复制)范例 - 对象将隐式共享相同的内部资源,只要它不被修改,如果某些副本尝试修改资源,它将是&#34 ;分离"从共享资源中,复制它并对其应用修改。

当对象生存期结束时,它会递减共享资源的引用计数器,如果它为零则表示没有其他对象使用它,因此它将被删除。如果引用计数大于零,则资源将保持活动状态,直到存在引用它的对象为止。

在案例1中,共享资源将被删除,因为没有更多对象引用它。

在案例2中,它也会被删除,因为在aImg被删除时tImg将超出范围。