Я пытаюсь реализовать алгоритм BFS с помощью GraphLab. В моей структуре vertex_data я использую вектор, чтобы провести путь, пройденный до сих пор.std :: vector :: push_back throws segmentation fault in GraphLab apply()
struct vertex_data {
std::vector<int> current_path;
bool visited;
int destination;
vertex_data() {
destination = -1;
visited = false;
}
}
Затем в функции применяются() Я пытаюсь нажать текущий идентификатор вершины в current_path этой конкретной вершины:
class bfs: public graphlab::ivertex_program<graph_type, graphlab::empty,
vertex_data> {
private:
vertex_data msg;
public:
void apply(icontext_type& context, vertex_type& vertex, const gather_type& gather_result) {
int vid = vertex.id();
vertex.data().destination = msg.destination;
vertex.data().visited = true;
msg.current_path.push_back(vid);
vertex.data().current_path.push_back(vid);
}
}
Также определение данных() в документации является:
vertex_data_type & data()
Returns a reference to the data on the vertex.
GraphLab заботится о обертывание vertex_data объект как vertex_data_type. Когда я запускаю его, я получаю ошибку seg в функции push_back() для некоторых вершин. Я проверил vid и всегда является целым числом с фактическим значением. Выполнение vertex.data(). Current_path.size(), я получаю 0.
Я пробовал несколько подходов, например, создание локального вектора и замену его на vertex.data() и изменение размера перед нажатием id. В первом случае я получаю ошибку seg при попытке заменить, а во втором случае изменение размера выполняется без проблем, но нажатие продолжает давать мне ошибку seg.
Есть ли у вас какие-либо идеи о том, что может быть проблемой?
Благодаря
Пожалуйста, покажите определение of 'vertex.data()' – Mat
Интересно, что возвращает ваш 'data()'. – user3528438
Вы уверены, что 'msg' на самом деле является экземпляром' struct vertex_data', а не, скажем, ссылкой на удаленный и перезаписанный мусор, который набирается как 'vertex_data', но может содержать что-нибудь? – abarnert