C++ 中由多个 += 运算符导致的分段错误
segmentation fault caused by multiple += operators in c++?
我正在为c ++开发一个粒子引力相互作用模拟程序,我几乎可以工作了,但是我有一个愚蠢的无法解释的错误,这让我发疯。
该程序有2048个粒子,并以200个时间步长模拟它们;在每个状态下,它根据所有其他粒子的净力更新每个粒子的新位置,速度和加速度。 基本上,这是我编写的递归函数,它遍历quad_tree并更新所有粒子值:
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的价值可能会以您意想不到的方式发生变化。
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?