Qt的容器在赋值时会产生隐式共享(赋值拷贝时并未产生实际的数据拷贝,仅仅是数据相关的指针的赋值),拷贝后直到修改值时,才会产生实际的拷贝,共享数据的容器会有一个计数器
cpp
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
QVector<int> listA;
for (int i = 0; i < 10000; i++) {
listA.push_back(i);
}
int& eleRef = listA[0];
{
QVector<int> listB = listA; // 产生隐式共享,listA和listB都共享一个实际数据的内存,并未产生深拷贝
listA[0] = 100; // 修改listA,产生写时复制,listA重新申请内存,将和listB共享的数据拷贝过来
}
// 此时listAEleRef所引用的数据仅存放在listB中了,但listB已经析构
std::cout << eleRef << std::endl; // 此处打印的值将不会是100(现象为随机数或者产生崩溃)
a.exec();
}