我想知道以下是否是一种返回深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
}
特别是,返回的向量如何不包含对堆栈内存位置的引用?
答案 0 :(得分:3)
是否安全取决于MyClass
。但假设它是well behaved class with value semantics,那么是的,它非常安全。 std::vector
按值存储其对象。当你这样做时:
objects.push_back(obj);
将obj
的副本放入向量中(假设您实际上有一个向量which you don't)。当你返回向量时,它是moved(虽然这个移动可以并且通常是optimized away)到调用函数。
答案 1 :(得分:2)
否强>
objects.push_back(obj);
局部变量,即obj, COPIED 进入矢量。因此,向量不会包含对局部变量的引用。
顺便说一下,你不能定义这样的矢量:
std::vector<MyClass> objects();
实际上,这是一个函数声明:一个名为objects的函数,它没有参数,并返回一个std :: vector。
相反,你应该这样做:
std::vector<MyClass> objects;
答案 2 :(得分:0)
在这种情况下,objects.push_back(obj);
会调用T const&
版本的std::vector::push_back 参数。