我的程序中有这个功能
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
答案 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();
}
}