2017-09-14 3 views
1

Ich kann derzeit nicht die Quelle der Segmentierung Fehler aus dem folgenden Programm finden.Zugriff auf std :: list in struct induzieren segfault

struct info 
{ 
    std::list<int> bfs; 
    int *level; 
    int *distance; 
}; 

... 

info* Graph::BFS(int s) 
{ 
    info *tmp = (info*) malloc(sizeof(struct info)); 
    tmp->level = new int[V]; 
    tmp->distance = new int[V]; 

    ... 

    tmp->bfs.push_back(s); !! <- causes a segmentation fault 
    tmp->level[s] = 0; <- seems to work ok 

    int current; 
    std::list<int>::iterator i; 
    while (!myqueue.empty()) 
    { 
     current = myqueue.front(); 
     myqueue.pop(); 
     tmp->bfs.push_back(current); <- causes segmentation fault 

    .... 

    return tmp; 
} 

Ich habe auch versucht, folgende zu tun, ohne Erfolg:

info *tmp = (info*) malloc(sizeof(struct info)); 
std::list<int> bsf; 
tmp->bsf = bsf // and then call tmp->bsf.push_back().... 
+3

Verwenden Sie nicht 'malloc'. – BLUEPIXY

+0

warum nicht? soll ich einfach neu benutzen? –

+0

Das ist falsch, um 'std :: list ' zu erstellen. – BLUEPIXY

Antwort

4

Das Problem ist mit C-Code C++ Code zu mischen.

In dieser Erklärung

info *tmp = (info*) malloc(sizeof(struct info)); 

einen Speicher für die Struktur zugeordnet ist, ohne Konstrukteuren ihrer Datenelemente aufrufen,

Statt malloc Sie den Operator new verwenden. Andernfalls wird das Datenelement std::list<int> bfs; nicht erstellt.