【问题标题】:Assigning local std::vector to reference in C++将本地 std::vector 分配给 C++ 中的引用
【发布时间】:2017-04-07 04:34:44
【问题描述】:

我不确定我的方法是否正确。 因为我通过引用Function 传递向量v,所以在它的执行之后向量的内容会改变。

如果我不能直接处理向量 v 并决定使用临时向量 temp 怎么办。通过v = temp 分配给v 我的临时地址是否正确?不会引用v 指向在执行Function 后将被清除的内存?

void Function(std::vector<bool> &v) {
  std::vector<bool> temp(v.size(), false);

  // some operations on vector temp
  // ...

  v = temp;
}

【问题讨论】:

    标签: c++ vector pass-by-reference


    【解决方案1】:

    不会引用v 指向在执行Function 后将被清除的内存吗?

    没有。对于v = temp;v 是从temp 分配的副本。那么v将包含与temp相同的内容,但与temp无关; temp 是本地对象,稍后会被销毁,但传入的参数不受影响。

    顺便说一句:由于temp 是一个本地对象,在退出函数时将被销毁,因此从中复制可能效率低下。你可以离开它:

    v = std::move(temp);
    

    【讨论】:

    • 编译器优化不会自动生成移动而不是复制,因为 temp 直接超出范围?
    • @A.S.H 可能,也可能不会。标准没有提到这种优化,它不能保证,也不能移植。所以还是自己动手做比较靠谱。
    • 如果我在Function 结束后尝试使用v,它不应该是不安全的,因为v 指向temptemp 不再存在。它会是任何如果使用指针而不是引用,则不同。
    • @GauravSehgal 否。指针与引用不同。分配引用时,您分配的是引用指向的变量的值,而不是引用本身。另一方面,您不能重新绑定对其他变量的引用。例如int i = 0; int j = 1; int&amp; r = i; r = j; j = 2; 那么ri 的值都是1,但是r 仍然绑定到i,而不是j
    • @songyuanyao 知道了。非常感谢。
    【解决方案2】:

    是的,分配 v = temp 是安全的。有关更多信息,请查看例如:https://isocpp.org/wiki/faq/references#overview-refs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-15
      • 2019-11-07
      • 2014-12-12
      • 2020-10-11
      • 2018-07-02
      • 2020-12-20
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多