0

私のプログラムにはこの機能があります

const char* Graph::toChar() {
    std::string str;
    const char* toret;
    str = "";
    for (vector<Edge*>::iterator it = pile.begin(); it != pile.end(); it++) {
        str += (*it)->toString();
    }
    toret = str.c_str();
    return toret;
}

次に、関数をデバッグして、リターントレットになるまですべてが正しく機能するようにします 。ライン。ステップオーバーを押すと、デバッガーはstd ::stringstr;に移動します。行とすべての文字列および文字変数は""になるため、関数の最終的な戻り値は""(何もありません)です。

私は何が間違っているのですか?

*(it)-> toString(); は正しく機能しており、デバッガーが* toret = str.c_str();*を実行すると、toretの値は正しいです。

どうも

4

1 に答える 1

4

ここで行っていることは悪いことです。スコープ外になったときに削除されようとしているのをc_str返しています。std::stringデバッグモードに関係なく、これは予測できない動作を意味します。実際にはかなり予測可能です-あなたのプログラムはクラッシュします:)

を返すか、引数としてconst std::string受け入れてビルドするか、を使用して文字列のc_strをメモリに残るものにコピーする必要があります。strdup()を使用すると、後でどこかで削除する必要があることに注意してください。std:string &strdup()

動作する関数の2つの形式は次のとおりです。

const std::string Graph::toChar() {
    std::string str;
    for (vector<Edge*>::iterator it = pile.begin(); it != pile.end(); it++) {
        str += (*it)->toString();
    }
    return str;
}

また

void Graph::toChar(std::string &out) {
    out = ""
    for (vector<Edge*>::iterator it = pile.begin(); it != pile.end(); it++) {
        out += (*it)->toString();
    }
}
于 2012-04-14T12:09:43.413 に答える