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