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); 
} 

내가 세그먼트 폴트를받을 이유가 이해가 안 돼요. 각 노드에 동적으로 메모리를 할당해야합니까? 여기

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의 객체를 할당하는 의미 :

+1

'각 노드마다 동적으로 메모리를 할당해야합니까?' 당연히 당신은해야합니다. – john

답변

1

음은 head은 그래서 당신이 정의되지 않은 동작을 제공 역 참조, begin_list 실행 도착 시간에 의해 초기화되지 않았습니다 해당 표현식의 결과를 head에 할당 한 다음 tailcurr을 동일한 개체로 지정하십시오.

그러나 이 아니며 new, delete 및 메모리 관리를위한 원시 포인터를 사용합니다. 스마트 포인터를 사용하여 소유권을 표현하는 것이 바람직합니다.

관련 문제