0

セグメンテーション違反が発生しています。それは私が比較をしている方法と関係があると思います。私は困惑していて、C++を初めて使用します。

最後の行pq.pop()は、スタックトレースに入り、失敗の原因となる呼び出しです。./a.outを実行しても何も出力されません

class Node {
    public:

    Node() {}

    Node(int b) {
        bound = b;
    }

    Node(int b, Node * p) {
        bound = b;
        parent = p;
    }

    void addChild(Node& n) {
        n.parent = this;    
    }

    Node * parent;

    int bound;
};



class CompareNode {

public:
    bool operator()(Node *n, Node *o)
    {
        cout << "Comparing " << n->bound;
        cout << " to " << o-> bound <<endl;
        return n->bound > o->bound; 
    }
};


メインの下で


std::priority_queue<Node*, vector<Node*>, CompareNode> pq;
Node* root = new Node();
Node* node;
for(int i = 0; i < n; i++) {
  node = new Node(matrix[0][i], root);
  pq.push(node);
}

pq.pop();


GDB


(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x00000000004027e7 in void std::__pop_heap<__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode>(__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode) ()
(gdb) backtrace
#0  0x00000000004027e7 in void std::__pop_heap<__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode>(__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode) ()
#1  0x0000000000401e13 in void std::pop_heap<__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode>(__gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, __gnu_cxx::__normal_iterator<Node**, std::vector<Node*, std::allocator<Node*> > >, CompareNode)
    ()
#2  0x0000000000401a11 in std::priority_queue<Node*, std::vector<Node*, std::allocator<Node*> >, CompareNode>::pop() ()
#3  0x00000000004015dc in main ()
4

1 に答える 1

1

多くの場合、C++ は必要な前提条件をチェックしません。空の構造体を呼び出すpopと、結果としてクラッシュする可能性があります。だから、それは私が最初に見たい場所です。

を使用して GCC でこのチェックを取得できます-D_GLIBCXX_DEBUG。境界チェック、反復子の検証などを追加し、いずれにしても優れた補助輪のセットです。

于 2013-03-07T04:44:35.420 に答える