C++:传递临时值不起作用,如何修复? 已经很久没有使用C++了,不能理解这里发生了什么,有人能帮助解释和给出一些建议吗? < P>这两种情况都不合法,因为在这两种情况下它们都是保存的。数据引用临时的STD::String S参数,只要构造函数返回,就停止存在。
事实上,第一个案例的工作是纯粹的巧合,有问题的内存尚未被重用,但它仍然是未定义的行为 实现这一目标的唯一方法是: 通过引用接收构造函数的参数,并确保它作为变量存在于调用方的作用域中,至少在切片存在的时间内: 继续按值接收,并将实际值与指针和大小一起存储在切片中,假设它们是可变的,而字符串不是:C++:传递临时值不起作用,如何修复? 已经很久没有使用C++了,不能理解这里发生了什么,有人能帮助解释和给出一些建议吗? < P>这两种情况都不合法,因为在这两种情况下它们都是保存的。数据引用临时的STD::String S参数,只要构造函数返回,就停止存在。,c++,C++,事实上,第一个案例的工作是纯粹的巧合,有问题的内存尚未被重用,但它仍然是未定义的行为 实现这一目标的唯一方法是: 通过引用接收构造函数的参数,并确保它作为变量存在于调用方的作用域中,至少在切片存在的时间内: 继续按值接收,并将实际值与指针和大小一起存储在切片中,假设它们是可变的,而字符串不是: 什么是切片?请发布一个。显示切片的实际定义,即具有成员函数数据的切片,该函数返回可以传递给printfas的内容,它们位于main中。BTW,主返回int,不是空隙,在标准C++中。我想使用第一个版本,但
什么是切片?请发布一个。显示切片的实际定义,即具有成员函数数据的切片,该函数返回可以传递给printfas的内容,它们位于main中。BTW,主返回int,不是空隙,在标准C++中。我想使用第一个版本,但是有什么方法可以使代码更简单吗?e、 我不想先定义s1str和s2str,然后再使用它们?我太懒了,不想再多加一行代码什么是数据?@ThomasSablik:考虑到他们存储的是指针和大小,我的假设是切片只是最初匹配原始字符串的字符串视图,但是可以调整前导指针数据和/或大小n,以查看更窄的数据范围。@MrROY:如果不移动到类似2的解决方案,则不能。调用者可以控制字符串的生存期,在这种情况下,他们必须将字符串存储在某个位置,或者切片可以。最接近中间解决方案的是某种基于std::shared_ptr的方法,其中切片存储一个拥有的引用,调用者可能存储也可能不存储一个拥有的引用,但这将比上述任何一种解决方案都更复杂、更慢,没有真正的好处。
Slice {
Slice(const std::string s): data_(s.data()), n_(s.size()) {}
}
std::string get_str(){
return "abcdefg";
}
void main(){
Slice s1("abcdefg");
printf("%s\n", s1.data()); // output: works fine
Slice s2(get_str());
printf("%s\n", s2.data()); // output: doesn't work
}
Slice {
// Now receives by const reference
Slice(const std::string& s): data_(s.data()), n_(s.size()) {}
}
std::string get_str(){
return "abcdefg";
}
void main(){
std::string s1str = "abcdefg"; // Store locally
Slice s1(s1str);
printf("%s\n", s1.data());
auto s2str = get_str(); // Store locally
Slice s2(s2str);
printf("%s\n", s2.data());
}
Slice {
// Add string member:
std::string origstring;
// Now receives by value, stores it and refers to data in member
Slice(std::string s): origstring(std::move(s)), data_(origstring.data()), n_(origstring.size()) {}
}
std::string get_str(){
return "abcdefg";
}
void main(){
Slice s1("abcdefg");
printf("%s\n", s1.data());
Slice s2(get_str());
printf("%s\n", s2.data());
}