QVector 的 operator[] 返回不正确的值

问题描述

QVectoroperator= 有 4 个示例:

auto value1 = (QVector<int>() << 1)[0]; //value is 1 (correct)
auto &value2 = (QVector<int>() << 1)[0]; //value is -572662307 (incorrect)
const auto value3 = (QVector<int>() << 1)[0]; //value is 1 (correct)
const auto& value4 = (QVector<int>() << 1)[0]; //value is -572662307 (incorrect)

那么,请您更清楚地解释这些示例好吗?据我所知,它是由 operator= 中的一个创建的“深拷贝”,但对我来说并不完全清楚。

解决方法

深拷贝与此无关。 QVector 的写时复制机制(这与“深复制”有关)对您来说是完全透明的,不会影响您的场景。暂时忽略此功能。

首先看看QVector::operator[]返回了什么。 它返回对 QVector 元素的引用。

现在,当您使用 & 时,您正在捕获对矢量项的引用。

现在 QVector<int>() 是一个临时对象,其活动范围仅限于该行。 所以就在分号之后,vector 被销毁并且引用指向 vector 的不存在元素(因为 vector 不再存在)。

这会导致未定义的行为,而您的运气不好并没有导致应用程序崩溃。

修复它的一种方法是不使用临时对象。

   QVector v;
   v << 1;
   auto value1 = v[0];
   auto &value2 = v[0];
   const auto value3 = v[0];
   const auto& value4 = v[0]; 

现在所有引用都指向仍然存在的值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...