2013-07-23 4 views
0

클래스 선언세그먼트 오류 :: 목록

struct cmp_str 
{ 
bool operator()(char const *a, char const *b) 
{ 
    return std::strcmp(a, b) < 0; 
} 
}; 

class event_t { 
public: 
    event_t(String *_session_time, String *_event_type, String *_table_name, String *_num_of_events); 
    ~event_t(); 
    char *table_name; 
    char *event_type; 
    pthread_mutex_t lock; 
    pthread_cond_t cond; 
    int num_of_events_threshold; 
    double time_out; 
    int num_of_events_so_far; 
}; 
std::map <char*, std::list<event_t*>, cmp_str > all_events; //global map 

내가 변수가 pthread_cond 및 pthread_mutex를 통해 이루어집니다 특정 임계 값에 도달하는 대기이 기능을 가지고있다. 그런 다음 반환합니다. 마지막 줄에 세분화 오류가 있습니다.

void foo(){ 
    //don't worry event object ic created properly 
    event_t *new_event = new event_t(args[0]->val_str(s),(args[1]->val_str(s)), (args[2]->val_str(s)), (args[3]->val_str(s))); 

    map<char*, list<event_t*> >::iterator map_it; 
    map_it = all_events.find(new_event->table_name); 

    if(map_it == all_events.end()){ 
     list<event_t*> *my_list = new list<event_t*>(); 
     my_list->push_back(new_event); 
     all_events[new_event->table_name] = *my_list; 
    } 
    else{ 
     map_it->second.push_back(new_event); 
     for (list<event_t*>::iterator list_it=map_it->second.begin(); list_it!=map_it->second.end(); ++list_it) 
     std::cout << (*list_it)->event_type << " " << (*list_it)->time_out << " " << (*list_it)->num_of_events_threshold << '\n'; 
    } 


/* 
* waiting for number of events reach its threshold. 
*/ 
    pthread_mutex_lock(&new_event->lock); 

    while(new_event->num_of_events_so_far < new_event->num_of_events_threshold) 
     pthread_cond_wait(&new_event->cond, &new_event->lock); 
    pthread_mutex_unlock(&new_event->lock); 
    // segmentation fault!!! 
    for (list<event_t*>::iterator list_it=map_it->second.begin(); list_it!=map_it->second.end(); ++list_it) 
     std::cout << (*list_it)->event_type << " " << (*list_it)->time_out << " " << (*list_it)->num_of_events_threshold << '\n'; 
} 
+0

뮤텍스를 초기화 했습니까? – AlexK

+0

예 event_t 클래스의 생성자에서 초기화되었습니다. –

+0

새 이벤트 목록을 마스터 맵에 추가하면 새로 추가 된 항목에'map_it '을 설정하는 것처럼 보이지 않습니다. 따라서 for-loop에 도달하여 반복자를 사용하려고 시도하면'end() '를 역 참조합니다. – WhozCraig

답변

1
if(map_it == all_events.end()){ 
    list<event_t*> *my_list = new list<event_t*>(); 
    my_list->push_back(new_event); 
    all_events[new_event->table_name] = *my_list; 
} 

이 코드 는 충돌합니다 함수의 맨 아래에 그것을 역 참조, 유효한 반복자를 가리키는 그래서 때를 map_it을 두지 않습니다.

당신은 아마 if { } 절 내부

map_it = all_events.find(new_event->table_name); 

같은 줄을 추가합니다.

+0

+1 (분명한 이유로, 글로벌 댓글 당). 또는 insert()에서 반환 된'std :: pair '를 사용하여 추가 검색을 수행하지 않고 적절한 반복자를 다시 얻을 수 있습니다. – WhozCraig

+0

이렇게하면 문제가 해결됩니다. 그러나 나는 먼저 해결하려고하는 또 다른 문제가있다. 고맙습니다. 적어도 15 가지의 평판이 필요하기 때문에 나는 upvote 할 수 없습니다. –