程序在调用类指针时收到信号SIGSEGV,分段错误

Program received signal SIGSEGV, Segmentation fault, when calling class pointer

本文关键字:SIGSEGV 信号 分段 错误 调用 指针 程序      更新时间:2023-10-16

这是我在这里的第一篇文章。我刚刚开始用C++编码,并尝试编写一个进行物理模拟的 progamm。它应该采用命令行参数,并根据给定的内容创建一个特定的类,该类确定使用的方法。

static Integrator*
CreateIntegrator( int argc, char** argv )
{
Integrator * integrator;
if(string(argv[1])=="Euler")
{
    EulerIntegrator Euler;
    integrator=&Euler;
    return integrator;
}
else if (string(argv[1])=="Runge-Kutta-2")
{
    SecondOrderRungeKuttaIntegrator Kutta2;
    integrator=&Kutta2;
    return integrator;
}
else if (string(argv[1])=="Runge-Kutta-4")
{
    FourthOrderRungeKuttaIntegrator Kutta4;
    integrator=&Kutta4;
    return integrator;
}
else
{
    return 0;
}
}
static void
RunSimulation( std::vector<Particle>& particle, Integrator* integrator )
{
static const int    FrameCount  = 500;
static const int    StepCount   = 10;
static const double TimeStep    = 0.01;
for( int frame = 0; frame < FrameCount; ++frame )
{
    for( int step = 0; step < StepCount; ++step )
        particle = integrator->update_particles( particle, TimeStep );
    PrintParticles( particle, frame );
}
}
int
main( int argc, char** argv )
{
Integrator* integrator = CreateIntegrator( argc, argv );
if( integrator != 0 )
{
    std::vector<Particle> particle = ReadParticles();
    RunSimulation( particle, integrator );
}

当我运行这个时,我的程序崩溃并显示以下错误:

程序接收信号SIGSEGV,分段错误。 0x000000000040259b 在 RunSimulation (粒子=..., 积分器=0x22fd30) 在 ..\测试\测试.cpp:116 116粒子=积分器->update_particles(粒子,时间步);

但是如果我在 main 函数中编写创建类,一切正常:

int
main( int argc, char** argv )
{
FourthOrderRungeKuttaIntegrator* integrator;
FourthOrderRungeKuttaIntegrator Kutta4;
integrator=&Kutta4;
if( integrator != 0 )
{
    std::vector<Particle> particle = ReadParticles();
    RunSimulation( particle, integrator );
}

我希望有人可以帮助我解决这个问题。谢谢!

问题是,当函数 CreateIntegrator 完成执行时,您创建的集成器将被销毁。例如:

if(string(argv[1])=="Euler") {
  EulerIntegrator Euler;
  integrator=&Euler;
  return integrator;
}

在这里,欧拉的实例在此范围内是本地的,当您退出函数时将被销毁。此实例存储在堆栈中。您需要在堆中创建它。为此,您需要执行以下操作:

if(string(argv[1])=="Euler") {
  EulerIntegrator *Euler = new Euler();
  integrator = Euler;
  return integrator;
}

确保在使用指针后将其删除,或者更好的是,如果您使用 C++11 或更高版本,请使用unique_ptr。