Бесконечное l oop при копировании класса, содержащего граф BGL - PullRequest
0 голосов
/ 25 марта 2020

У меня есть структура (State - чистый виртуальный абстрактный класс):

    using GraphColorGraph =  boost::adjacency_list<boost::listS, boost::setS, boost::undirectedS,
                                               boost::property<boost::vertex_index_t, size_t>>;
    using GraphColorEdge =   boost::graph_traits<GraphColorGraph>::edge_descriptor;
    using GraphColorVertex =  boost::graph_traits<GraphColorGraph>::vertex_descriptor;
    class GraphColor : public State<ZykovMove> {

     private:
      GraphColorGraph graph;
     public:
      GraphColor() = default;
      explicit GraphColor(const GraphColorGraph &graph) : graph(graph) {}
      /*GraphColor(const GraphColor &other): State(other) {
        boost::copy_graph(other.graph, this->graph);
      }
      GraphColor &operator=(const GraphColor &other) {
        boost::copy_graph(other.graph, this->graph);
        return *this;
      }*/
}

Проблема, у меня есть функция, которая предназначена для многократного вызова (много раз!):

std::pair<GraphColor, Vertex> expand(const Vertex &not_important, const GraphColor& root , Graph &not_important) const {
      // ... code 
      auto copy_root = root; // infinite loop if copy contructors enabled 
      return make_pair(copy_root, foo) // seg fault if the copy constructors not enabled.
}

Возможно, в коде скрыто поведение с неопределенным поведением, потому что, когда происходит второй вызов этой функции, копия вызывает бесконечное l oop. но если отключить копирование контуров в GraphColor, то нет проблем с копированием GraphColor, но есть проблема в make_pair (), которая выдает segfault, вызванную InvalidRead (valgrind). В двух звонках root не меняется.

1 Ответ

1 голос
/ 25 марта 2020

Решено, у меня было неопределенное поведение, потому что я хранил vertex_descriptor и пытался использовать его в другом графе, вызывающем этот эффект, эти vertex_descriptors были недействительными.

...