2016-05-23 3 views
-2

これは私の最初の投稿です。私はちょうどC++でコーディングを開始し、物理シミュレーションを行うprogammを作成しようとしました。 コマンドライン引数を取る必要があり、指定されたものに応じて、どのメソッドが使用されるかを決定する特定のクラスが作成されます。プログラム受信信号SIGSEGV、セグメンテーションフォールト、クラスポインタの呼び出し時

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); 
} 

私はこれを実行すると、私のプログラムの開発がクラッシュやショーがエラーは、次のとおりです。

Program received signal SIGSEGV, Segmentation fault. 0x000000000040259b in RunSimulation (particle=..., integrator=0x22fd30) at ..\test\test.cpp:116 116 particle = integrator->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

あなたのコンパイラは、ローカル変数のアドレスを返すことについて警告を出すことはありませんか? (もっと)警告を有効にする必要があります。 http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scopeを参照してください。 –

+0

[ダングリングポインタとは何か]の可能な複製(http:// stackoverflow。 com/questions/17997228 /なんとぶら下がっているポインタ) – user657267

答えて

0

問題は、CreateIntegrator関数の実行が終了すると、作成したIntegratorが破棄されることです。たとえば、

ここで、オイラーのインスタンスはこのスコープ内でローカルであり、関数を終了すると破棄されます。このインスタンスはスタックに格納されます。ヒープで作成する必要があります。そのためには、あなたがこのような何かをする必要があります。

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

はあなたが上記のC++ 11またはを使用している場合であっても良く、unique_ptrをを使用し、それを使用したりした後、ポインタを削除することを確認します。

関連する問題