向量在返回时是否被复制

Does a vector get copied on return?

本文关键字:复制 是否 返回 向量      更新时间:2023-10-16

不久前,当从函数返回向量时,我遇到了一大堆问题,对象被销毁(以及它们的堆数据)。我不记得确切的细节了,所以我今天尝试返回一个对象向量,但它们的析构函数没有被触发。

我记错了吗?如果我做了一个这样的向量:

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"中。

您不应该为它做任何特别的事情,这就是"按值返回"机制的工作方式。

相关文章: