2015-05-02 127 views
0

我正在研究我的數據結構類的哈希表實驗室。當我在插入函數中使用push_back()函數時,我不斷收到一個我認爲正在發生的設置錯誤。但是,我不確定是什麼導致了這個錯誤。當我嘗試push_back C++項目時,爲什麼會出現seg故障?

using namespace std; 

    HashTable::HashTable(int buckets) { 
     this->buckets = buckets; 
     vector<Entry>* table = new vector<Entry>[buckets]; 
    } 


    Entry HashTable::insert(GameBoard board, int number) { 
     int index = compress(board.hashCode()); 
     Entry entry = Entry(board, number); 
     table[index].push_back(entry); 
     return entry; 
    } 


    int HashTable::compress(int hashCode) { 
     return (hashCode % buckets); 
    } 


    Entry::Entry(GameBoard board, int value) { 
     this->board = board; 
     this->value = value; 
    } 


    int GameBoard::hashCode() { 

     int hashVal = 0; 

     for (int r = 0; r < DIMENSION; r++) { 
      for (int c = 0; c < DIMENSION; c++) { 
       hashVal = ((127 * hashVal) + board[r][c]) % 16908799; 
      } 
     } 

     return hashVal; 
    } 
+0

它是push_back調用還是它是[]運算符?我對'vector * table = new vector [buckets];'的合法性有些模糊,但段錯誤通常是來自壞數組索引。 – sabreitweiser

+0

'hashCode%bucket''不會產生一個統一的分佈,除非'bucket'分割可能的哈希數。記住這一點。 –

+0

加載調試器的時間。 (我們不能爲你從這裏做到這一點) –

回答

5

在你的問題中所示的代碼:

HashTable::HashTable(int buckets) { 
    this->buckets = buckets; 
    vector<Entry>* table = new vector<Entry>[buckets]; 
} 

你創建一個局部變量table這是一個指向vector<Entry>,然後泄漏內存。然後在HashTable::insert中嘗試訪問未初始化的成員變量table

+0

感謝您指出。內存泄漏究竟在哪裏,我該如何解決? – UBears

+0

良好的捕獲,可能OP隱藏一個成員'表'(因爲他似乎稍後在其他成員函數中使用它)。 @UBears如果你已經聲明'table'是你類的成員,那麼只需使用'table = new vector [bucket]',那麼不要忘記在析構函數中delete [] table'。 – vsoftco

+0

@UBears內存泄漏正是在代碼複製到我的答案。再次閱讀我的答案,但我可以在這裏重複:在那裏創建一個名爲'table'的局部變量。 – Slava

0
HashTable::HashTable(int buckets) { 
     this->buckets = buckets; 
     vector<Entry>* table = new vector<Entry>[buckets]; // this table is local to this function, also a memory leek. 
    } 

正如我可以在你HashTable構造看,要初始化本地vector<Entry>* table到你的構造。

Entry HashTable::insert(GameBoard board, int number) { 
     int index = compress(board.hashCode()); 
     Entry entry = Entry(board, number); 
     table[index].push_back(entry); 
     return entry; 
    } 

,我可以看到你在insert方法要push_back()其他一些table。 Seg。因爲你去push_back到一個不健康的table

您的HashTable課程中有任何vector<Entry>* table嗎?如果您已將HashTable::HashTable(int buckets)更改爲初始化該表,如下所示。

 HashTable::HashTable(int buckets) { 
      this->buckets = buckets; 
      table = new vector<Entry>[buckets]; // Init class attribute `vector<Entry>* table` 
     } 

如果沒有你在HashTable類有任何vector<Entry>* table,將其添加到您的類並使用上述HashTable::HashTable(int buckets)

這將解決您的問題。

相關問題