2017-03-23 11 views
0

私は、神経シミュレーションのプロジェクトに取り組んでいます。私は理解できませんし、gdbでは理解できません。私はこのような何かを持っているSmartPointersC++変数を呼び出すとseg faultが生成される[smartPointed object]

を使用してメートル:

class vehicle:enable_shar_from_this() { 
    protected 
    double direction_; 
    } 

class car: public direction_ { 
    friend class policeAgent; 
    public: 
    void change_direction(rnd); 
    } 

class policeAgent: enable_share... { 
    public: 
    std::vector<CarSmartPointer> cars ={}; 
    void close_the_street(rnd); 
} 

car::change_direction(rnd_num){ 
    OLD_direction=direction; 
    direction+=direction+rnd_num; 
    newCar=make_shared<CarSmartPointer>(); 
    arriving_cars.push_back(newCar); 
    } 

publicAgent::close_the_street(rnd_num){ 
    lastCar= cars.cend(); 
    for (myCar=cars.begin(); myCar!=lastCar; myCar++) 
     {(*myCar)->change_direction(rnd_num);} 

main{ 
auto sbirro makeshared<publicAgent>(); 
while (not cars.empty()){ 
sbirro->closeTheStreet() 
} 
} 

すべての変数が適切なコンストラクタで初期化され、このプログラムは、100〜150サイクルのために実行されます、それはセグメンテーションフォルト!! 割り当てがOLD_direction = directionのときに起こる 私は 'direction'を印刷しようとしましたが、segfaultは前に行が印刷されているので確信しました コンテナの最後には発生しません。最後の車ではありませんが、segFault

これはバックトレースです。プログラムは巨大でOpenMPを使用していますが、この場合はまったく呼び出されません。 私はpythonインターフェイスを使用して、私は別のコンピュータ上のmain.cppを見て、全体のプログラムを初期化するコードの多くの行は、私は明日行うつもりです。成長の

Thread 1 "python3" received signal SIGSEGV, Segmentation fault. 

0x00007ffff6319675は:: GrowthConeは::成長 /..my_folders../elements/GrowthCone.cpp:52で

52ダブルstore_angle(これは0x0の、rnd_engine = ... =)を= angle_;

gdb) bt 
#0 0x00007ffff6319675 in 
growth::GrowthCone::grow(std::mersenne_twister_engine<unsigned long, 
32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 
2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>&) (this=0x0, 
rnd_engine=...) 
at /..my_folders../elements/GrowthCone.cpp:52 
#1 0x00007ffff631ce2e in growth::Neurite::update_growth_cones(std::mersenne_twister_engine<unsigned 
long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 
2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>&) (this=0x983700, 
rnd_engine=...) 
    at /..my_folders../elements/Neurite.cpp:58 
#2 0x00007ffff631cd70 in 
growth::Neurite::grow(std::mersenne_twister_engine<unsigned long, 32ul, 
624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 
15ul, 4022730752ul, 18ul, 1812433253ul>&) (this=0x983700, rnd_engine=...) 
    at /..my_folders../elements/Neurite.cpp:44 
#3 0x00007ffff631245d in 
growth::Neuron::grow(std::mersenne_twister_engine<unsigned long, 32ul, 
624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 
15ul, 4022730752ul, 18ul, 1812433253ul>&) (this=0x724390, rnd_engine=...) 
    at /..my_folders../elements/Neuron.cpp:120 
#4 0x00007ffff630f37f in 
_ZN6growth17SimulationManager8simulateERKNS_4TimeE._omp_fn.0(void)() 
    at /..my_folders../kernel/simulation_manager.cpp:110 
#5 0x00007ffff535e15f in GOMP_parallel (fn=0x7ffff630f251 
<_ZN6growth17SimulationManager8simulateERKNS_4TimeE._omp_fn.0(void)>, 
data=0x7fffffffd010, num_threads=1, flags=0) at 
/build/gcc/src/gcc/libgomp/parallel.c:168 
#6 0x00007ffff630efeb in 
growth::SimulationManager::simulate(growth::Time const&) (this=0x99b2b0, 
t=...) 

答えて

0

ループしながら、私はコンテナを修正しましたので、それは未定義の動作だった問題をお願いします。

解決方法新しい車を保管するための一時コンテナを追加し、古いコンテナに挿入します。

関連する問題