C ++筛选代码中的隐形内存错误

时间:2018-04-05 17:23:34

标签: c++ c++11 debugging memory-leaks

我用C ++编写了一个非常基本的eratosthenes筛子,但是当n1000000(一百万)时,代码崩溃了。我无法解决问题,现在需要帮助。

#include <iostream>
#include <vector>

using namespace std;

int main(){
    long n = 1000000,i ,j;
    vector<bool> arr(n, true);

    for(i = 2; i * i < n; i++){

        if(arr[i]){
            for(j = i + i; j <= n; j += i){
                arr[j] = false;
            }
        }
    }
    cout << "Made it here." << endl;
    return 0;
}

一些信息:

  • 我使用x64 mingw(Windows 10)编译器编译。
  • 使用-O2,禁用没有区别
  • n = 100000n = 10000000不会出错(非常奇怪)并且代码工作正常,因此超过一百万的值不会产生问题,而一百万则会出错(崩溃)。
  • 代码可以打印"Made it here."
  • 尝试使向量全局(考虑本地内存限制问题),无济于事。
  • 使用DrMemory进行调试,显示一个错误1 total unaddressable access(es),这是我找不到的。

感谢您的帮助。

编辑:Drmemory

中错误的更多通知说明

Error #1: UNADDRESSABLE ACCESS beyond heap bounds: writing 0x0000000003921608-0x000000000392160c 4 byte(s)

1 个答案:

答案 0 :(得分:1)

for(j = i + i; j <= n; j += i){
    arr[j] = false;

j == n时会发生什么?您访问超出范围的arr[n]arr.size() == n

这是未定义的行为。您的程序可能会崩溃,或者可能会无声地继续,或者它可能会执行其他操作。你不能推断会发生什么,因为 - 按照定义 - 行为没有被定义。