c++ - c++中多个+=运算符引起的段错误?

标签 c++ stack-overflow quadtree

我正在为 C++ 开发一个粒子引力相互作用模拟程序,我几乎快要开始工作了,但是我有一个愚蠢的无法解释的错误,这让我发疯。

该程序有 2048 个粒子,并以 200 个时间步模拟它们;在每个状态下,它根据所有其他粒子的合力更新每个粒子的新位置、速度和加速度。基本上,这是我编写的递归函数,它遍历四叉树并更新所有粒子值:

    void iterateThroughQuadTree(double alpha, double delta_t)
    {
        std::cout << particles_count << std::endl;
        if (particles_count > 10)
        {
            //std::cout << particles_count << std::endl;
            children[0]->iterateThroughQuadTree(alpha,delta_t);
            children[1]->iterateThroughQuadTree(alpha,delta_t);
            children[2]->iterateThroughQuadTree(alpha,delta_t);
            children[3]->iterateThroughQuadTree(alpha,delta_t);
        }
        if (particles_count > 0)
        {

          std::cout << *(particles_x) << " " << *(particles_y) << " " << *(particles_vx) << " " << *(particles_vy) << std::endl;
          double acc_magnitude = 0, distance = 0, unit_vector_x = 0, unit_vector_y = 0, x_displacement = 0, y_displacement = 0, theta = 0, x_acc = 0, y_acc = 0;
          for (size_t i = 0; i < particles_count; i++) {
              double temp_x_acc = 0;
              double temp_y_acc = 0;
              for (size_t k = 0; k < particles_count; k++) {
                  if (i != k) {
                      x_displacement = particles_x[k] - particles_x[i];
                      y_displacement = particles_y[k] - particles_y[i];
                      distance = sqrt(pow(x_displacement,2) + pow(y_displacement,2));
                      unit_vector_x = x_displacement / distance;
                      unit_vector_y = y_displacement / distance;
                      acc_magnitude = particles_m[k] / pow(distance,2);
//                    //theta = atan(y_displacement/x_displacement);
                      x_acc = acc_magnitude * unit_vector_x;
                      y_acc = acc_magnitude * unit_vector_y;
//                    //x_acc = (x_displacement);
//                    //y_acc = (y_displacement);
                      temp_x_acc = temp_x_acc + x_acc;
                    //temp_y_acc = temp_y_acc + y_acc;
                  }
              }
              //std::cout << temp_x_acc << " " << temp_y_acc << std::endl;
              particles_x[i] += ((particles_vx[i]*delta_t) + alpha*temp_x_acc*pow(delta_t,2));
              particles_y[i] += ((particles_vy[i]*delta_t) + alpha*temp_y_acc*pow(delta_t,2));
              particles_vx[i] += 2*alpha*temp_x_acc*delta_t;
              particles_vy[i] += + 2*alpha*temp_y_acc*delta_t;
//            if (i < 1) {
//                //std::cout << *(particles_x + i) << " ";
//            }
          }
        }
    }

如果你注意函数中间的下面两行:

temp_x_acc = temp_x_acc + x_acc;
//temp_y_acc = temp_y_acc + y_acc;

错误是如果其中一行被注释掉(哪一行都无关紧要),程序运行正常。但是当它们都被取消注释时,程序会在几次迭代后崩溃并出现段错误。我使用了 ValGrind Memcheck,它说存在堆栈溢出。我不明白为什么这两行不能一起出现在程序中;一个简单地总结所有 x 分量加速度,一个总结 y 分量加速度。当我有两个 += 运算符时是否存在某种类型的内存问题?我每次都尝试重新初始化变量,但我仍然得到相同的结果。如果您知道为什么会发生这种情况,能否请您向我解释一下?谢谢,感谢您的帮助。

如果需要,我会为该程序发布额外的代码,问题是该程序很大,所以我不想发布超出需要的代码。

最佳答案

虽然没有看过您的所有代码,但我有一个可能站得住脚的理论。在代码中未显示的某处,您肯定修改了 particles_count 的值,这是一个全局变量。除非 particles_count 降至 10 以下,否则您的递归函数不可能终止。

是否有可能当同时设置 temp_x_acc 和 temp_y_acc 时,您的 particles_count 值会以某种方式上升,从而导致循环迭代次数更多,从而导致堆栈溢出?作为帮助验证的完整性检查,我建议您在函数顶部添加一个静态计数器,如下所示:

static int iteration=0;
iteration++;
cerr<<"Iteration: "<<iteration<<", "<<Particles count: "<<particles_count<<endl;

请注意 cerr 的使用,以便在它崩溃之前获得所有输出。 cout 在崩溃时可能不会打印整个故事。

一般在递归代码中,像 particles_count 这样的重要变量应该作为函数参数传递。我认为 particles_count 的值可能会以您意想不到的方式发生变化。

关于c++ - c++中多个+=运算符引起的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991597/

相关文章:

c - 如何在 FreeRTOS 上模拟堆栈溢出

java - 如何清理四叉树的边缘?

spatial - MX-CIF 四叉树的批量加载算法

c++ - 关于嵌套结构 C++

c++ - 从 cin 读取 PNG 文件

c++ - std::bind causes illegal indirection error

c++ - 如何创建会抛出堆栈溢出异常的无限递归?

java - 类构造函数中的堆栈溢出错误

c++ - C++ 中的四叉树或八叉树模板化实现

c++ - 如何告诉 link.exe 使用 wmain 作为入口点。 LNK2019 : unresolved external symbol main referenced in function __tmainCRTStartup