4

既存のツリー オブジェクトを文字列に変換する関数を作成しました。文字列のフォーマットは

parent ( child1 ) ( child2 ( childOfChild2 ) )

プログラムは文字列を正しく出力し、他の作業を行いますが、でクラッシュします

Segmentation fault (core dumped)

これは関数です(getTree(this->root)ツリー全体を出力します):

template <typename T>
string Tree<T>::getTree(const Node<T>& node) {
    if (node.isLeaf()){
        return to_string(node.value);
    }

    vector<future<string>> results; //each element represents a subtree connected to "node"
    for (auto child:node.children){
        results.push_back(move(async(&Tree<T>::getTree,this,ref(*child))));
    }

    string children("");
    for (auto& result:results){
        children+=string(" (") + result.get()+ string(") ");     //this creates Segmentation fault, but the output is correct
        //children+=string("");                                  //this does not create Segmentation fault
        //children+=string("foo");                               //this creates Segmentation fault
    }

    return to_string(node.value)+children;
}  

変数に関する情報:

vector<shared_ptr<Node>> children;

さらに情報が必要な場合はお知らせください。完全なソースはtree.cpptree.hです。

4

1 に答える 1

1

イテレータの比較関数が機能しません。両方のコンテナが空の場合もカバーする必要があります。

bool operator!= (const Iter& other) const {
    if (this->queueToIter.empty()&& other.queueToIter.empty()) return false;
    if (this->queueToIter.empty()&&! other.queueToIter.empty()) return true;
    if (!this->queueToIter.empty()&& other.queueToIter.empty()) return true;
    return (this->queueToIter.front())!=(other.queueToIter.front());
};
于 2012-10-26T08:41:31.190 に答える