这是我在这里的第一篇文章。我刚刚开始使用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 );
}
我希望有人可以帮我解决这个问题。 非常感谢你!
答案 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。