2012-10-31 51 views
0
void change_degree(vector<int> &nodes, map<int, vector<int> > &edges, int vertex){ 
    map<int, vector<int> >::iterator ite; 
    ite = edges.find(vertex); 
    vector<int> temp = (*ite).second; 
    vector<int>::iterator it; 
    for(it = temp.begin(); it != temp.end(); it++){ 
     cout << *it; 
     if(nodes[*it + 1] > 1) 
      nodes[*it + 1]++; 
    } 
} 

這個函數生成錯誤未知錯誤++程序

*** glibc detected *** ./a.out: munmap_chunk(): invalid pointer: 0x09c930e0 *** 

誰能告訴我爲什麼它的到來又意味着什麼? 在此先感謝。

+0

是否有可能'頂點'不在'邊緣'?否則,該函數中唯一可能的無效訪問是'nodes [* it + 1]'。 –

+3

'gdb'和'valgrind'說嗨! – GradGuy

+0

頂點存在邊緣。 – neel

回答

3

那麼,我看到的一個問題是,你沒有檢查是否vertex實際上在edges中找到。你可能會解引用你不擁有的內存。

void change_degree(vector<int> &nodes, map<int, vector<int> > &edges, int vertex){ 
    map<int, vector<int> >::iterator ite = edges.find(vertex); 
    if (ite != edges.end()) { // <-- this is what you're missing 
     vector<int> temp = (*ite).second; // <-- this is probably where you're dying 
     vector<int>::iterator it; 
     for(it = temp.begin(); it != temp.end(); it++){ 
      cout << *it; 
      if(nodes[*it + 1] > 1) // <-- you could also be crashing here 
       nodes[*it + 1]++; 
     } 
    } 
} 

下一次,嘗試通過GDB運行您的應用程序,並檢查您的堆棧跟蹤。

編輯:另一種可能性是你不正確地索引到nodes。檢查nodes[*it + 1]是否有效。

+0

正如我在評論中寫的,頂點存在於邊緣,甚至在檢查條件ite!= edges.end()之後,它會給出相同的錯誤 – neel

+0

,因爲它是由於節點[* it + 1]而給出的。謝謝@moswald – neel