QString能否在两个Qt容器间共享而无需执行深拷贝?
关于QString在Qt容器中的拷贝机制问题
代码示例
QSet<QString> set; QList<QString> list; QString str("hello"); set.insert(str); list.append(str);
问题
该QString是被深拷贝至两个容器中,还是在三个变量间共享(即QString中仅存一份"hello"拷贝,引用计数为3)?
解答
是三个变量(str、set中的元素、list中的元素)共享同一份"hello"的底层数据,此时引用计数为3,不会触发深拷贝。
原因是Qt的QString采用了**隐式共享(写时复制,Copy-on-Write)**机制:
- 执行
set.insert(str)和list.append(str)时,只是复制了QString的对象外壳(包含指向底层数据的指针、引用计数等元数据),并没有复制实际的字符串内容。 - 只有当其中任意一个
QString对象被修改(比如调用str.append("world"))时,才会触发深拷贝,为该对象创建独立的底层数据副本,同时调整引用计数。
内容的提问来源于stack exchange,提问作者alkmaar
相关产品推荐
相关产品推荐

