在C ++,Linux中,我们有一个3元素的双向迭代器。从end()
开始递减有时指向最后一个元素,但有时指向第一个元素。
在我们的项目(ARM, Linux)
中,我们使用双向iterator
,大多数情况下使用3个元素。访问元素时,有时我们会使用end()
函数。在我们从gcc 8
升级到新的gcc 4
之前,该方法工作正常。使用新的编译器,我们遇到了一些奇怪的结果。最后,我发现原因是迭代器prev(end())
有时指向第一个元素而不是最后一个元素。
我尝试调试的问题:
1)尝试了--it
,prev(it)
,rbegin()
,它们都具有相同的行为。请注意,问题不会一直发生。但是,尽管发生了这三种方法,但结果却是相同的。它只会从end()
开始递减。其他元素的递增/递减始终有效。
2)我编写了一个小型测试程序,使用相同的编译器进行了编译。这个问题永远不会发生。
3)使用较旧的编译器(gcc 4.7
),在以调试模式编译项目时遇到了这个问题。我们在调试模式下采取了一些解决方法(不使用end()
)。现在,使用新的gcc 8.3
,它甚至可以在常规构建中发生。因此,我们想深入了解问题并尝试找出问题所在。请注意,在更新到新的gcc
时,我们也将Linux kernel
从3.0
更新为4.4
。
我怀疑这可能与内存对齐问题有关,因为受影响的代码每秒被调用一次。行为是-它连续5秒指向第一个元素,然后连续3秒指向最后一个元素。似乎它受内存中代码执行位置的影响。
我可以尝试使用任何compiler flags
设置吗?
示例代码:
#include <iostream>
#include <map>
int main(void)
{
std::map<int,int> mymap;
mymap[11] = 100;
mymap[22] = 200;
mymap[33] = 300;
std::map<int,int>::const_iterator it = mymap.end();
--it;
printf("%d ", it->first);
}
在工作时,它应该打印33。但是有时它会打印11。