以下代码片段输出非常奇怪。我本来期望一个溢出错误(Python会给出MemoryError)。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> a{1,2,3};
for( auto const & item : a)
a.push_back(item);
for( auto const & item : a)
std::cout<<item<<',';
return 0;
}
输出结果:1,2,3,1,0,3,
这个结果怎么解释呢?
如果你在Python中做了类似的事情,它会出现内存错误。
>>> a = range(0,20)
>>> for i in a:
a.append(i)
Traceback (most recent call last):
File "<pyshell#3>", line 2, in <module>
a.append(i)
MemoryError
>>>
这个问题浮现在我的脑海中,因为上面的代码写法被认为是绑定安全的。对于绑定安全的容器,在
foreach type iteration
期间,容器不应该增长/缩小。所以这是一个漏洞抽象。有没有一种方法可以包装这个
foreach
循环,以便在循环体中不允许引起大小修改/重新分配的任何操作。