当调用类指针时,程序接收信号SIGSEGV,Segmentation fault

时间:2016-05-23 23:14:53

标签: c++

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

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,分段故障。   位于.. \ test \ test.cpp的RunSimulation(particle = ...,integrator = 0x22fd30)中的0x000000000040259b:116   116 particle = integrator-&gt; update_particles(particle,TimeStep);

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

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

我希望有人可以帮我解决这个问题。 非常感谢你!

1 个答案:

答案 0 :(得分:0)

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

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

这里,Euler的实例在此范围内是本地的,并且在退出函数时将被销毁。该实例存储在堆栈中。您需要在堆中创建它。要做到这一点,你需要做这样的事情:

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

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

相关问题