2010-05-19 2 views
1

은 (미래의 독자들에게 참고 : 오류, 당연히, 내 코드에 있고 수 std하지 :: _ Rb_tree_rebalance_for_erase())분할 오류가 :: _ Rb_tree_rebalance_for_erase()가

내가 프로그래밍 다소 새로운 해요 std 함수에서 오는 것처럼 보이는 분할 오류를 처리하는 방법을 잘 모르고 있습니다. 컨테이너를 오용하는 등 바보 같은 일을하기를 바란다. 문제를 해결할 방법이 없기 때문이다.

정확한 오류 프로그램 신호를 수신 EXC_BAD_ACCESS

인 메모리에 액세스 할 수 없습니다.
이유 : 주소 KERN_INVALID_ADDRESS : 0x000000000000000c
0x00007fff8062b144 STD에 :: _ Rb_tree_rebalance_for_erase()
(GDB) 역 추적
STD # 0 0x00007fff8062b144 :: _ Rb_tree_rebalance_for_erase()
1 시뮬레이션 :: runEpidSim에 0x000000010000e593 (이 = 0x7fff5fbfcb20) stl_tree.h에서 : 1263
# 주 2 0x0000000100016078() MAIN.CPP에서 43

세그먼트 오류가 두 컨테이너의 내용을 업데이트 성공적으로 직전 종료 함수입니다. 하나는 boost::unordered_multimap이고 carriage입니다. 하나 이상의 struct Infection 개체가 포함되어 있습니다. 다른 컨테이너는 ce이라는 std::multiset< Event, std::less< Event > > EventPQ 유형입니다.

마지막으로 cout << 줄이 seg fault 바로 앞에 나타납니다.

내 생각에 지금까지이 기능을 수행 한 후 ce에서 리 밸런싱을 시도했지만 리 밸런싱이 실패하는 이유는 확실하지 않습니다. 내가 ce.erase(epqItr);을 제거 할 때 (프로그램이 즉시 다른 이유로 충돌하지만) 나는 독방 감금 오류를 확인했습니다


업데이트는 사라집니다. 코드의 다른 위치에서 이벤트를 성공적으로 제거 할 수 있습니다. ce의 항목을 지우는 데 사용하는 코드는 이고 여기에있는 내용은입니다. 최적화 (덕분에, BDK)없이 를 역 추적

는 훨씬 더 많은 정보를 보여준다 :

프로그램은 신호 EXC_BAD_ACCESS를 받아 메모리에 액세스 할 수 없습니다.
이유 : 주소 KERN_INVALID_ADDRESS : 0x000000000000000c
0x00007fff8062b144 STD에 :: _ Rb_tree_rebalance_for_erase()
(GDB) 역 추적
# STD 0 0x00007fff8062b144 :: _ Rb_tree_rebalance_for_erase()
# STD 1 0x00000001000053d2 :: _ Rb_tree, STD : : less,> std :: allocator> :: 지우기 (this = 0x7fff5fbfdfe8, __position = {_ M_node = 0x10107cb50})> stl_tree.h : 1263
# 2 0x0000000100005417 std :: multiset, std :: allocator :: :: stl_multiset에서 지우기 (this = 0x7fff5fbfdfe8, __position = {_ M_node = 0x10107cb50}).H : 346 # 3 0x000000010000ba71 시뮬레이션 :: runEpidSim (이 0x7fff5fbfcb40를 =)에 Simulation.cpp에서 43

하는 엑스 코드 행 번호를 읽는 경우를 제외하고 426
# MAIN.CPP AT) (주 4 0x000000010001fb31 잘못된, 내 하드 드라이브에있는 유일한 stl_tree.h 라인 1263에 비어 있습니다.

복구를 호출하는 기능을 볼 수있는 사람이 몇 명 있습니다. 조금 복잡합니다 :

struct updateRecovery{ 
updateRecovery(int s, double t, EventPQ & ce) : s_(s), t_(t), ce_(ce) {} 
    void operator() (boost::shared_ptr<Host> ptr) { 
    ptr->recover(s_, t_, ce_); 
    } 
private: 
    int s_; 
    double t_; 
    EventPQ & ce_; 
}; 

// allHosts is a boost::multiindex container of boost::shared_ptr<Host> 
// currentEvents is the EventPQ container 
// it is an iterator to a specific member of allHosts 
allHosts.modify(it, updateRecovery(s, t, currentEvents)); 
cout << "done with recovery" << endl; 

마지막 cout 인화입니다. 코드는 복구 기능의 특정 버전없이 이전에 작동했습니다.

노아 로버츠 (Noah Roberts)는 문제가 Simulation.cpp 426 행에 있다고 지적했다. 당황스러운 해결책을 위해 아래로 이동하십시오.

+0

stl_tree.h의 내용 : 1263은 무엇입니까? –

+0

내 하드 드라이브 (내 HD에서 '_Rb_tree_rebalance_for_erase'를 포함하는 유일한 파일)에 나타나는 유일한 stl_tree.h는 1263 행의 * blank * (?!)입니다. i686-apple-darwin10에서 gcc 4.2.1 (Apple build 5646)을 사용하고 있습니다. rebalance_for_erase 함수는 299-429 행에 정의되어 있습니다. – Sarah

+1

Host :: recover를 호출 한 직후에 호출 코드에 cout을 넣으면 출력됩니까? 또한 모든 최적화와 인라이닝을 해제하여 컴파일을 시도하면 더 유용한 스택 추적을 얻을 수 있습니다. – bdk

답변

관련 문제