//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会创建一个共享副本吗?
答案 0 :(得分:2)
Qt中的隐式共享遵循CoW(写入时复制)范例 - 对象将隐式共享相同的内部资源,只要它不被修改,如果某些副本尝试修改资源,它将是&#34 ;分离"从共享资源中,复制它并对其应用修改。
当对象生存期结束时,它会递减共享资源的引用计数器,如果它为零则表示没有其他对象使用它,因此它将被删除。如果引用计数大于零,则资源将保持活动状态,直到存在引用它的对象为止。
在案例1中,共享资源将被删除,因为没有更多对象引用它。
在案例2中,它也会被删除,因为在aImg
被删除时tImg
将超出范围。