访问QList
超出其范围的 a不会引发异常。相反,它假定您已经检查过索引是否在范围内(如果这不是真的会发生什么,下面会解释)。
实际上,这不是一个糟糕的设计,而是容器类的一个好的设计:有时(在大多数情况下)您已经知道索引在范围内。如果 Qt 应该通过抛出异常对越界访问做出反应,这意味着您要依赖此检查,这意味着必须完成此检查(即使您不需要 Qt 来检查它)。Qt 所做的是假设您提供了一个有效的索引。在调试版本中,这会通过断言进行检查,如果不满足断言,您的程序会以某种原因终止(您可以很好地跟踪它以进行调试),但在发布模式下,根本不会进行此检查,因此它会静默如果索引仍然超出范围,则会产生未定义的行为访问数据结构中的原始内存。这是尽可能快的,但要求索引有效。
如果不满足断言将终止您的进程,这意味着您无法“捕获”此类错误。首先避免它,即在访问列表之前测试您的索引是否在范围内。
请注意,某些(可能是全部?)容器类还提供具有“真实”索引检查的访问(没有崩溃,也在发布版本中),即在超出范围时具有定义和预期的行为。对于QList
,这个函数是:
T value(int index, T fallbackValue)
它尝试通过index
边界检查访问元素。如果您的索引不在范围内(或在关联容器中:未找到),fallbackValue
则将返回您提供的索引。第二个参数默认为 default-constructed T
。请注意,即使您的索引正确,也必须构造此值。这就是为什么即使在您想要检查的情况下,最好使用分支手动进行检查,并且仅在需要时构造默认值(特别是如果您需要评估昂贵的表达式来构造回退值):
if (index < myList.count()) // We only check upper bound in this scenario
foo = myList[index];
else
foo = expensiveFunctionReturningMyFallbackValue();