有谁知道,为什么以下代码在使用 g++ 编译时会崩溃?
#include <iostream>
unsigned long getSumDivisors(const unsigned long number) {
unsigned long sum = 0;
for(unsigned long i = 0; i < number; ++ i) {
if(number % i == 0) {
sum += i;
}
}
return sum;
}
int main() {
std::cout << getSumDivisors(5);
return 0;
}
当我删除 sum += i;它不会崩溃。
我尝试在 windows 和 linux linaro 下编译它
g++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3 版权所有 © 2012 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅来源。没有 保修单;甚至不是为了特定目的的适销性或适用性。
和
g++ (tdm-2) 4.8.1 版权所有 (C) 2013 Free Software Foundation, Inc. 这是免费软件;有关复制条件,请参阅来源。没有 保修单;甚至不是为了特定目的的适销性或适用性。
最佳答案
它会导致 SIGFPE。原因是因为被零除:
if(number % i == 0)
你可以在这里修复它:
for(unsigned long i = 1; i < number; ++ i)
SIGFPE 通常会在具有浮点单元的系统上发生,在这种情况下会引发异常。实际行为取决于实现细节并且未定义。在具有浮点仿真库的旧系统上,它可能返回 0 或随机结果。
关于c++ - 运行时发生奇怪的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21732822/