2016-05-23 29 views
-2

這是我第一篇文章。我剛剛開始用C++編寫代碼,並嘗試編寫一個程序,進行物理仿真。 它應該有一個命令行參數,並根據給定的內容創建一個特定的類,它決定了使用哪種方法。程序收到信號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); 
} 

當我運行此我PROGRAMM崩潰,並顯示跟隨誤差:

Program received signal SIGSEGV, Segmentation fault. 0x000000000040259b in RunSimulation (particle=..., integrator=0x22fd30) at ..\test\test.cpp:116 116 particle = integrator->update_particles(particle, TimeStep);

但如果我寫的創建主要功能一切類工作正常:

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 /問題/ 17997228 /什麼 - 是 - 一 - 懸空指針) – user657267

回答

0

問題是,當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刪除指針。

相關問題