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;
}

然后我正在调试该功能,一切正常,直到我 返回 toret;线。我按下 step over ,调试器将转到std::string str; line 和所有字符串和字符变量都变成"",所以函数的最终返回是""(什么都没有)。

我究竟做错了什么?

*(它)->toString(); 工作正常,当调试器执行 *toret = str.c_str();* toret中的值是正确的。

谢谢

4

1 回答 1

4

你在这里做的很糟糕:你正在返回c_str一个std::string超出范围时即将被删除的。不管调试模式与否,这意味着不可预测的行为。实际上相当可预测 - 你的程序会崩溃:)

您应该返回const std::string、接受std:string &作为参数并构建它,或者使用strdup()将字符串的 c_str 复制到将保留在内存中的内容。请记住,使用 strdup() 意味着您必须稍后将其删除。

以下是可以使用的两种形式的函数:

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 回答