これは私にとっては非常に奇妙なことですが、プログラムを起動すると、予期しないランダムなセグメンテーション違反が発生します。動作する場合もあれば、クラッシュする場合もあります。Dev-C++のデバッガーは、ファイルの行を指し示します:stl_construct.h
/**
* @if maint
* Constructs an object in existing memory by invoking an allocated
* object's constructor with an initializer.
* @endif
*/
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_]allocator::construct
-> ::new(static_cast<void*>(__p)) _T1(__value);
}
ちなみに私はSTLを広範囲に使用しています。セグメンテーション違反の原因を検出するにはどうすればよいですか?役立つツールはありますか?このようなランダムなクラッシュにつながる可能性がある理由は何ですか。
編集:
私のプログラムは約5000行のコードを数えます。問題の原因がわからないので、助けを得るためにどのコードを表示する必要があるのかわかりません。デバッガーから得たのは、STLに関係しているということだけです。
編集:
ここに移動しましたCode::Blocks
。これがコールスタックです。
#0 00464635 std::_Construct<std::pair<double const, int>, std::pair<double const, int> >(__p=0xb543e8, __value=@0x10) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_construct.h:81)
#1 00462306 std::_Rb_tree<double, std::pair<double const, int>, std::_Select1st<std::pair<double const, int> >, std::less<double>, std::allocator<std::pair<double const, int> > >::_M_create_node(this=0x406fe50, __x=@0x10) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tree.h:367)
#2 00461DA7 std::_Rb_tree<double, std::pair<double const, int>, std::_Select1st<std::pair<double const, int> >, std::less<double>, std::allocator<std::pair<double const, int> > >::_M_clone_node(this=0x406fe50, __x=0x0) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tree.h:379)
#3 004625C6 std::_Rb_tree<double, std::pair<double const, int>, std::_Select1st<std::pair<double const, int> >, std::less<double>, std::allocator<std::pair<double const, int> > >::_M_copy(this=0x406fe50, __x=0x0, __p=0x406fe54) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tree.h:1029)
#4 00462A9D std::_Rb_tree<double, std::pair<double const, int>, std::_Select1st<std::pair<double const, int> >, std::less<double>, std::allocator<std::pair<double const, int> > >::_Rb_tree(this=0x406fe50, __x=@0xb59a7c) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_tree.h:559)
#5 0045A928 std::map<double, int, std::less<double>, std::allocator<std::pair<double const, int> > >::map(this=0x406fe50, __x=@0xb59a7c) (C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/bits/stl_map.h:166)
#6 0040B7E2 VehicleManager::get_vehicles_distances(this=0xb59a50) (C:/Program Files/CodeBlocks/MinGW/projects/AHS/VehicleManager.cpp:232)
#7 00407BDA Supervisor::IsMergeInstruction(id_vehicle=1) (C:/Program Files/CodeBlocks/MinGW/projects/AHS/Supervisor.cpp:77)
#8 00408430 CheckingInstructionsThread(arg=0x476100) (C:/Program Files/CodeBlocks/MinGW/projects/AHS/Supervisor.cpp:264)
#9 00413950 _glfwNewThread@4() (??:??)
#10 75A24911 KERNEL32!AcquireSRWLockExclusive() (C:\Windows\system32\kernel32.dll:??)
#11 00476100 std::__ioinit() (??:??)
#12 0406FFD4 ??() (??:??)
#13 76E5E4B6 ntdll!RtlInitializeNtUserPfn() (C:\Windows\system32\ntdll.dll:??)
#14 00476100 std::__ioinit() (??:??)
#15 70266582 ??() (??:??)
#16 00000000 ??() (??:??)
さらにいくつかの精度:
1/マルチスレッドアプリケーションです。2 /メソッド:get_vehicles_distances(); マップを返します。3 / IsMergeInstruction()によって呼び出されるまでに、マップが初期化されていない可能性があります。
編集:
どうやらセグメンテーション違反を引き起こしている行は次のとおりです:
vehicles_distances_.erase(vehicles_distances_.begin(), vehicles_distances_.end());
ここで、vehicles_distances_はマップです。この行はメソッドの一部です:VehicleManager :: MoveAllVehicles();
void VehicleManager::MoveAllVehicles() {
vehicles_distances_.erase(vehicles_distances_.begin(), vehicles_distances_.end());
vector<Vehicle>::iterator iter_end = VehicleManager::vehicles_.end();
for(vector<Vehicle>::iterator iter = VehicleManager::vehicles_.begin();
iter != iter_end; ++iter) {
(*iter).MoveVehicle();
vehicles_distances_[(*iter).get_vec_vehicle_position().y] = (*iter).get_id_vehicle();
}
}
それの何が問題になっていますか?
編集:
map :: clear();を使おうとしました。map :: Erase();の代わりとして; しかし、同じ問題が発生します!
編集:
わかったと思います...スレッドがクリアされている間、vehicles_distances_を利用しようとしています..(?)
編集:
問題が解決しました!つまり、それはmap :: Erase();から来ていました。予想通り。<key, value>
マップを更新できるように、ペアが反転された別のマップ変数を作成することで、問題を回避しました。(必要なキーは距離であり、距離は毎回変化するため一意ではありませんが、id_vehicleは一意であるためです!)最後に、私はそのマップを取得し、<key, value>
再度反転して、各サイクルで再宣言できる元のマップに転送しました...
みんな、ありがとう !