向量在返回时是否被复制
Does a vector get copied on return?
不久前,当从函数返回向量时,我遇到了一大堆问题,对象被销毁(以及它们的堆数据)。我不记得确切的细节了,所以我今天尝试返回一个对象向量,但它们的析构函数没有被触发。
我记错了吗?如果我做了一个这样的向量:
std::vector<myObject> MakeVectorOfMyObjects(int size) {
std::vector<myObject> ret;
for (int i = 0; i < size; i++) {
ret.push_back(myObject());
}
return ret;
}
并这样称呼它:
std::vector<myObject> stuff = MakeVectorOfMyObjects(5);
是否可以保证现在驻留在"stuff"中的向量与我在函数中构建的向量完全相同,而在返回和赋值过程中没有任何对象被破坏、重建模或以其他方式操纵?
还有,我是通过引用还是通过值将向量传递给函数,这有什么区别吗?
编辑:得到了一个有点模糊的答案,所以让我换一种说法:如何保证"stuff"中的向量与我在函数中创建的向量是同一堆比特?(在使用新关键字创建向量并返回指针之外)
是否保证现在驻留在"stuff"中的向量与我在函数中构建的向量完全相同,而在返回和赋值过程中没有任何对象被破坏、重建模或以其他方式操纵
没有。但它可能是。这是由于可选的返回值优化。写得好的代码必须在任何一种情况下都能工作。
还有,我是通过引用还是通过值将向量传递给函数,这有什么区别吗
是的。通过引用或值传递向量的规则与任何类的规则相同。
当您从函数返回局部向量"ret"对象时,它将被复制(或在C++11中移动)到局部对象"stuff"中。
您不应该为它做任何特别的事情,这就是"按值返回"机制的工作方式。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 如果我在块中编写字符串文字,是否会从数据部分复制整个字符串数据?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- std::vector 是否有用于引用的复制构造函数?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- 通过引用传递是否涉及复制地址
- 如何检查文件复制和写入是否成功
- 字符串是否在其构造函数中复制数据
- 内存C++复制是否将内存地址复制到另一个阵列