在C++中将本地std::vector分配给引用

4

我不确定我的方法是否正确。由于我将向Function传递的向量v引用,因此在执行后,向量的内容将更改。

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

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

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

  v = temp;
}
2个回答

5

使用Function后,v是否会指向一些在执行完毕后将被回收的内存空间?

不会。对于v = temp;v是从temp中进行了复制赋值。然后v将包含与temp相同的内容,但与temp没有任何关系;temp是一个局部对象,稍后将被销毁,但传递的参数不会受到影响。

顺便说一下:由于temp是将在函数退出时销毁的局部对象,从其进行复制可能效率较低。你可以从中移动:

v = std::move(temp);

编译器优化会自动生成移动语义而不是复制吗?因为 temp 直接超出作用域了。 - A.S.H
@A.S.H 可能会,也可能不会。这种优化并未在标准中提到,它没有保证性和可移植性。因此最好自己进行优化以使其更加可靠。 - songyuanyao
如果在 Function 结束后尝试使用 v,因为 v 指向的是 temp,而 temp 已经不存在,所以这样做不安全,对吗?如果使用指针而不是引用,会有什么不同吗? - Gaurav Sehgal
@GauravSehgal 不是的。指针和引用是不同的。当你赋值一个引用时,你赋的是被引用变量的值,而不是引用本身。另一方面,你不能将引用重新绑定到其他变量上。例如:int i = 0; int j = 1; int& r = i; r = j; j = 2; 那么 ri 的值都是 1,但 r 仍然绑定在 i 上,而不是 j 上。 - songyuanyao
@songyuanyao 我明白了,非常感谢。 - Gaurav Sehgal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接