2013-03-15 14 views
6

Próbuję użyć biblioteki wykresów doładowania, a otrzymuję błąd segfault, gdy próbuję użyć metody boost :: edge(). Pełny kod jest dostępny here, ale tutaj zrobiłem minimalny program, który ma ten sam problem (jestem kompilacji z „g ++ minimal.cpp”):doładowanie :: krawędź powodująca segfault

#include<stdio.h> 
#include<boost/graph/adjacency_list.hpp> 

using namespace boost; 
using namespace std; 

typedef adjacency_list<> graph_t; 
typedef graph_traits<graph_t>::edge_descriptor edge_descriptor; 

int main(){ 
    graph_t G; 
    //add_edge(1,3,G); 
    //remove_edge(1,3,G); 
    pair<edge_descriptor, bool> res = edge(1,3,G); 
    printf("G does %shave an edge 1->3\n", res.second ? "" : "not "); 
    return 0; 
} 

Gdybym odkomentowaniu add_edge, linie remove_edge , Błąd segfault nie występuje, a program drukuje oczekiwany , ale czy istnieje sposób na uniknięcie takich hakerów? Dzięki!

+0

To wygląda trochę jak robaka. Jeśli nie możesz uzyskać poprawnej odpowiedzi na Stackoverflow, możesz chcieć to zgłosić na [Boost-Devel Mailing List] (http://news.gmane.org/gmane.comp.lib.boost.devel). – Mankarse

Odpowiedz

0

Najwyraźniej wywołanie add_edge(1,3,G) dodaje w razie potrzeby wierzchołki do wykresu. Twoje pierwsze połączenie jest w takim przypadku. Następnie dodaje krawędź od wierzchołka 1 do wierzchołka 3. Zauważ, że po tym wywołaniu liczba wierzchołków wynosi 4, ponieważ wierzchołki są następnie indeksowane od 0 do 3.

Kolejne wywołanie remove_edge(1,3,G) usuwa krawędź, która była tylko dodane, ale pozostawia niezmienioną liczbę wierzchołków.

Z drugiej strony wywołanie edge(1,3,G) nie dodaje żadnego wierzchołka do wykresu, boolean w powrocie jest tam, aby określić, czy wierzchołki 1 i 3 są połączone, czy też nie. Naruszenie dostępu polega na usunięciu add_edge, ponieważ wierzchołki w indeksie 1 i 3 nie istnieją.

można po prostu zainicjować wykres z żądanej liczby wierzchołków:

graph_t G(4); 
+0

Doceniam uwagę, ale to zostało opublikowane 6 miesięcy temu. Nie aktywnie już pracuję nad tym projektem. Z powyższego przykładu również nie wynika, ale myślę, że musi być nieco bardziej skomplikowany, niż opisujesz. Nie sądzę, aby wywołanie add_edge (1,3, G) dodało wierzchołki 0 i 4. – bgschiller

+0

W rzeczywistości śledziłem instrukcję za pomocą debuggera i byłem zaskoczony, że znalazłem "if (x> = num_vertices (g_)) g_ .m_vertices.resize (x + 1); " (boost \ graph \ detail \ adjacency_list.hpp, linia 2186, boost 1.50) – Raffi

+0

W każdym razie, każde pytanie tego rodzaju zasługuje na odpowiedź. – Raffi

Powiązane problemy