为什么这个无限循环程序会终止?

时间:2020-04-15 04:57:22

标签: python c++ vector infinite-loop applicationwillterminate

我正在和我的朋友谈论这两段代码。他说python终止,C ++终止。

Python:

arr = [1, 2, 3]
for i in range(len(arr)):
  arr.append(i)
print("done")

C ++:

#include <iostream>
#include <vector>
using namespace std;

int main() {
  vector<int> arr{1,2,3};
  for(int i = 0; i < arr.size(); i++){
    arr.push_back(i);
  }
  cout << "done" << endl;
  return 0;
}

我挑战了这一点,并在2台计算机上运行了它。第一个内存不足(分配错误),因为它有4gb的ram。我的Mac为12gb的ram,它能够运行并终止得很好。 我认为它不会永远运行,因为vector中size()的类型是一个无符号的int。由于我的Mac是64位的,因此我认为它可以存储2 ^(64-2)= 2 ^ 62个整数(这是正确的),但是由于某种原因,大小的unsigned int是32。

C ++编译器中的这个bug是否不会将max_size()更改为相对于系统硬件的错误?溢出导致程序终止。还是其他原因?

1 个答案:

答案 0 :(得分:2)

您的C ++编译器中没有bug会在此处显示。

int溢出(由于i++),其行为未定义。 (在这种情况下,在某些平台上用完内存是可行的。)请注意,没有定义的行为会使i为负,尽管这在带有2的补码符号整数的机器上很常见。类型一旦获得std::numeric_limits<int>::max(),并且如果i为-1,则i < arr.size()将为false,因为i隐式转换为{{1 }}类型。

Python版本会预先计算unsigned;后续的附加操作不会更改该初始值。