【发布时间】:2021-07-27 01:51:45
【问题描述】:
前几天我看到了一个奇怪的行为。 所以我想将行(存在于向量中)存储在 char 数组中,并想使用 '\n' 作为分隔符。
我知道字符串类中的 c_str() 方法返回一个指向以 '\0' 结尾的 char 数组的指针。
基于我对 C++ 的经验/理解。(请参阅 greet0 和 greet2 函数)。 我认为它应该可以工作,但它没有。
谁能解释三个 greet 函数中的不同行为?每个 greet 函数中提到的对象的范围是什么? (我也猜想字符串对象在 greet1 函数中被破坏了,但如果是这样的话,cout
//The snippet that where i first encountered the issue.
const char* concatinated_str(std::vector<std::string> lines, const char *delimiter)
{
std::stringstream buf;
std::copy(lines.begin(), lines.end(), std::ostream_iterator<std::string>(buf, delimiter));
string w = buf.str();
const char *ret = w.c_str();
return ret;
}
//Implementation 0
string greet0(){
string msg = "hello";
return msg;
}
//Implementation 1
const char* greet1(){
string msg = "hello";
cout<<&msg<<endl;
return msg.c_str();
}
//Implementation 2
const char* greet2(){
const char* msg = "hello";
return msg;
}
int main(){
auto w0 = greet0();
cout<<&w0<<endl;
cout<<"greet0:"<<w0<<endl;
auto w1 = greet1();
cout<<"greet1:"<<w1<<endl;
const char* w2 = greet2();
cout<<"greet2:"<<w2<<endl;
}
输出:
0x7fff0ff3e8e0
0x7fff0ff3e8e0
greet0:hello
greet1:
greet2:hello
【问题讨论】:
-
cout<<&w0<<endl;cout<<&msg<<endl;您正在输出指向std::string的指针。删除 & -
当您的程序尝试对它无权使用的内存进行操作时,您只会收到“分段错误”。在这种情况下你不会得到一个,因为字符串的内存要么在你的堆栈上(短字符串优化),要么它使用的堆内存被释放但没有返回给操作系统(这是一种内存分配优化,用于加速未来malloc / 新操作。)
标签: c++ string pointers local-variables dangling-pointer