Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++:传递临时值不起作用,如何修复? 已经很久没有使用C++了,不能理解这里发生了什么,有人能帮助解释和给出一些建议吗? < P>这两种情况都不合法,因为在这两种情况下它们都是保存的。数据引用临时的STD::String S参数,只要构造函数返回,就停止存在。_C++ - Fatal编程技术网

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