【问题标题】:Bad value in function returning string and const char*函数返回字符串和 const char* 中的错误值
【发布时间】:2012-04-14 12:01:55
【问题描述】:

我的程序中有这个功能

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

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

我做错了什么?

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

谢谢

【问题讨论】:

  • 你为什么返回char const*而不是一个字符串?
  • string::c_str query 的可能重复项

标签: c++ string


【解决方案1】:

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

您应该返回const std::string,接受std:string &amp; 作为参数并构建它,或者使用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();
    }
}

【讨论】:

  • 我想返回 char const* 因为我想用这个函数来调用另一个带有系统的程序( graph->toChar() );因此,也许其他解决方案是创建不会从函数中删除的 const char* ( str.c_str(); ) 的副本。我怎样才能做到这一点?或者也许是另一个更好的解决方案
  • 如果您使用例如我的第一个返回字符串的示例,您可以这样做:system(graph-&gt;toChar().c_str());
猜你喜欢
  • 2012-05-26
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多