0

我有一個頭文件,我在這裏定義方法。我最終試圖實現一個雙向鏈表來存儲對的數據。 這是cont.h訪問結構時出現分段錯誤

template <class Key, class T> class storage; 

template < class Key, class T, class Compare = std::less<Key> > 
class cont{ 
    private: 
     storage <Key, T> data; 
    public: 
     typedef size_t size_type; 
     typedef Key key_type; 
     typedef T mapped_type; 

     //default constructor 
     cont(){} 

     cont(key_type k, mapped_type m) 
     { 
      std::pair<Key, T> x = std::make_pair(k,m); 
      data.begin_list(x); 

      //std::pair<Key, T> a = std::make_pair(k,m); 
      //data.push(a); 
     } 



}; 

template <class Key, class T> 
struct node 
{ 
    node *prev, *next; 
    std::pair<Key, T> node_data; 
}; 

template <class Key, class T> 
class storage{ 
    private: 
     node <Key, T> *head; 
     node <Key, T> *tail; 
     node <Key, T> *curr; 
     int size; 
    public: 
     //default ctor 
     storage(){} 

     void begin_list(std::pair <Key, T> h) 
     { 
      size=1; 
        //bottom two lines induce segmentation fault 
      //head->node_data=h; 
      //head->prev=NULL; 

     } 

}; 

main.cc看起來就像這樣:

#include "cont.h" 
int main() { 
    cont<double, int> s(6.6, 3); 
} 

我不明白爲什麼我得到段錯誤。我應該爲每個節點動態分配內存嗎?

+1

'我應該爲每個節點動態分配內存嗎?'當然你應該。 – john 2013-05-04 19:52:42

回答

1

好,head沒有被begin_list被執行時被初始化,所以取消引用它給你未定義行爲:

void begin_list(std::pair <Key, T> h) 
    { 
     size=1; 

     head->node_data=h; // <= DEREFERENCING head WITHOUT HAVING INITIALIZED IT 
     head->prev=NULL; // <== SAME HERE 
    } 

在這裏,你大概意思在storage構造動態分配node類型的對象中,分配對應new表達與head(然後使tailcurr和指向同一對象的結果。

然而,請缺點ider 而不是使用newdelete和用於存儲器管理目的的原始指針。優先使用智能指針來表達所有權。