【问题标题】:operator[] of QVector returns incorrect valueQVector 的 operator[] 返回不正确的值
【发布时间】:2021-05-12 00:34:16
【问题描述】:

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= 之一创建的,但对我来说并不完全清楚。

【问题讨论】:

  • 它与深拷贝或operator= 无关——您引用了生命周期已结束的对象。

标签: c++ qt copy qvector


【解决方案1】:

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

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

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

现在QVector&lt;int&gt;() 是一个临时对象,其活动范围仅限于该行。 因此,在分号之后,vector 被销毁,并且 reference 指向不存在的 vector 元素(因为 vector 不再存在)。

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

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

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

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

【讨论】:

  • 非常感谢!但是有一些我无法理解的东西 - 出于某种原因,所有 4 种情况都可以在 Linux (gcc x64) 上正常工作,并且问题只能在 Windows (MSVS) 上重现?
  • 未定义的行为意味着任何事情都可能发生:它可能会崩溃,它可能会给出无效值,它似乎可以正常工作,......苍蝇可能会从你的鼻子里飞出来;)。如果您启用地址清理程序或使用 Valgrind,这些工具应报告正确的错误。s
猜你喜欢
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2016-10-09
  • 2021-10-26
  • 2015-10-13
  • 2014-12-06
  • 2021-02-01
  • 2017-08-21
相关资源
最近更新 更多