函数返回字符串和const char *中的值不正确

时间:2012-04-14 12:01:56

标签: c++ string

我的程序中有这个功能

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; 行。我按下步骤,调试器将转到 std :: string str; 行,所有字符串和字符变量变为“”,因此函数的最终返回值为< em>“”(没什么)。

我做错了什么?

*( it) - &gt; toString(); 正常工作,当调试器执行* toret = str.c_str(); * toret 中的值时是对的。

THX

1 个答案:

答案 0 :(得分: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();
    }
}