Mac上C ++中for循环的奇怪行为

时间:2017-10-04 14:21:01

标签: c++ macos

我有以下功能:

std::vector<std::vector<Surfel>> testAddingSift(
        const Groundtruth &groundtruth, 
        SurfelHelper &surfelHelper) {
    for (int k = 0; k < 10; k++) {
        std::cout << "hej" << k <<std::endl;
    }
}

当我忘记返回vector<vector<Surfel>>时,我得到了一个无限循环:

 hej1025849
 hej1025850
 hej1025851
 hej1025852

当我返回vector<vector<Surfel>>时,我得到:

hej0
hej1
hej2
hej3
hej4
hej5
hej6
hej7 
hej8
hej9

当然忘记返回向量是错误的,但为什么for循环会受到影响?

我正在使用Sierra和CLion的MacBook Pro,我认为它很铿锵。

2 个答案:

答案 0 :(得分:8)

无法从具有非void返回类型的函数返回undefined behavior。根据定义,这样做几乎不可能推断出由此产生的行为。这可能会影响在预期会遇到未定义行为的点之前的代码行为。

答案 1 :(得分:1)

这里正确的答案是,这当然是未定义的行为,所以任何事情都可能发生。一个更有趣的问题是,世界上有什么愚蠢的东西,比如忘记一个返回语句,会导致无限循环?

  

这不是我第一次忘记归还某些东西,但这在以前从未引起过这种问题。

我最好的猜测是,您看到的结果与当对象具有非平凡的复制构造函数时按值返回对象有关。在您的情况下,复制构造函数是非常重要的,因为它需要处理嵌套数组。特别是,我怀疑如果将返回类型更改为int,无限循环将会消失(但行为仍然未定义)。

我的猜测是,当你的循环调用operator <<时,它会在堆栈上放置返回地址。一旦operator <<返回,堆栈帧就会被闲置,但其内容保持不变。我怀疑复制返回的向量的代码重新解释了&#34;垃圾&#34;的内容。将帧叠加为具有大量元素的向量,并调用循环体而不是复制数组元素。

这只是一种可能性。如果你想知道发生了什么,正确的方法是挖掘反汇编。