按值返回对象的向量

Returning a vector of objects by value

本文关键字:向量 对象 返回      更新时间:2023-10-16

我想知道以下内容是否是返回对象深度vector的安全方法。

class MyClass {
    //...
}
std::vector<MyClass> get_list(a,b,c) {
    // obj is created on the stack
    MyClass obj(a,b,c);
    std::vector<MyClass> objects();
    objects.push_back(obj);
    // objects[0] contains a pointer to a stack variable?
    return objects
}

特别是,返回的向量如何不包含对堆栈内存位置的引用?

是否安全取决于MyClass .但是假设它是一个具有价值语义的行为良好的类,那么是的,它是完全安全的。 std::vector按值存储其对象。执行此操作时:

objects.push_back(obj);

obj的副本被放入向量中(假设你实际上有一个向量,而你没有)。当你返回向量时,它被移动到调用函数(尽管这个移动可以并且通常被优化掉)。

NO.

objects.push_back(obj);

局部变量,即 obj,被复制到向量中。因此,向量将不包含对局部变量的引用。

顺便说一下,你不能定义这样的向量:

std::vector<MyClass> objects();

实际上,这是一个函数声明:一个名为 objects 的函数,它没有参数,并返回一个 std::vector。

相反,您应该这样做:

std::vector<MyClass> objects;

在这种情况下,objects.push_back(obj);调用 std::vector::p ush_back 的T const&版本,它将复制参数。