C++ C++;函数终止后字符串文字的更改
我有三个类似的功能:C++ C++;函数终止后字符串文字的更改,c++,string,C++,String,我有三个类似的功能: MyStruct foo() { //do something... return get_var("string literal"); } MyStruct get_var(const string &literal) { return (MyStruct) {some_attribute, &*literal.begin(), literal.size()}; //struct needs const cha
MyStruct foo() {
//do something...
return get_var("string literal");
}
MyStruct get_var(const string &literal) {
return (MyStruct) {some_attribute, &*literal.begin(), literal.size()}; //struct needs const char*
}
void bar() {
Mystruct var;
//do stuff
var = foo();
std::cout << var.string_attribute;
}
MyStruct foo(){
//做点什么。。。
返回get_var(“字符串文字”);
}
MyStruct get_var(常量字符串和文本){
return(MyStruct){some_属性,&*literal.begin(),literal.size()};//结构需要常量字符*
}
空条(){
Mystruct-var;
//做事
var=foo();
std::cout启用最大编译器警告。它应该提醒您正在尝试返回指向临时文件的指针
行string my_literal=“string literal”
创建一个字符串,然后将对该字符串的常量引用传递到函数中。然后在foo()
末尾,my_literal
被销毁。它已消失。指向该字符串的任何指针现在都无效
在那之后,任何不好的事情都可能发生,那就是未定义的行为。c++是一种从c语言发展而来的古老语言,其结果是,用于描述该行为的行为和术语可能会相当混乱
“字符串文字”是源代码中由引号包围的字符序列。在大多数上下文中,它的计算结果是指向以null结尾的字符序列(“C字符串”)的指针。在正常情况下*所述字符序列在ProStream的整个生命周期内确实保持有效
另一方面,代码中的类型string
可能是指std::string
(通过在某处使用命名空间std
),它是一个表示自动管理的字符串的类
当您执行get_var(“string literal”);
或string my_literal=“string literal”;
C字符串隐式转换为std::string
。此操作创建字符序列的副本。与原始字符序列不同,当拥有该序列的std::string
被销毁时,将释放该序列的字符
&*literal.begin是获取指向std::string所拥有的字符序列的指针的一种非正统方法。使用c_str会更正常。但这与您的问题无关。重要的一点是内存中的字符序列是std::string所拥有的,而不是string literal的原始序列
在get_var(“string literal”);
的情况下,std::string将在语句完成后立即销毁。在string my_literal=“string literal”;
的情况下,当变量my_literal
超出范围时,它将被销毁。无论哪种方式,它都会在foo()之前销毁
返回。因此,当您执行std::cout时,从literal
获取const char*
的正确方法是使用literal.c_str()
而不是&*literal.begin()
。但是,由于您没有显示MyStruct
的外观或它对const char*
的作用,您的问题最有可能的原因是由于literal
在将const char*
提供给MyStruct
后,由于const char*
而被销毁,所以悬空指针是一个很好的猜测,但没有足够的信息代码为我们复制行为,这只是一个猜测。请提供一个示例,以便我们不必猜测。(我们缺少所使用的MyStruct
构造函数的定义。为了完整性,还应该有一个MyStruct
的精简定义,该定义声明此构造函数和string\u属性
)
MyStruct get_var(const string &literal) {
std::cout << literal;
return (MyStruct) {some_attribute, &*literal.begin(), literal.size()}; //struct needs const char*
}
MyStruct foo() {
//do something...
string my_literal = "string literal";
std::cout << my_literal;
return get_var(my_literal);
}