2016-07-09 41 views
0

我在想,如果以下是返回深度为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 
} 

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

回答

3

安全与否取决于MyClass。但假设它是一个well behaved class with value semantics,那么是的,它是完全安全的。 std::vector按价值存储其对象。当你这样做:

objects.push_back(obj); 

obj副本放入载体(假设你实际上有一个载体,which you don't)。当你返回矢量时,它是moved(尽管这个移动可以并且通常是optimized away)到调用函数。

+0

感谢。在我的例子中'MyClass'将包含一些非常大的成员数据矩阵作为成员。如果事情被复制,是否意味着通过'MyClass(large_matrix)'构造'MyClass'也是一个问题?在处理大对象时,标准做法是什么?对不起,新的C++。 – Flash

2

NO

objects.push_back(obj); 

局部变量,即物镜,是COPIED到载体中。所以矢量将不包含对局部变量的引用。

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

std::vector<MyClass> objects(); 

其实,这是一个函数声明:命名对象的功能,它没有参数,并返回一个std :: vector的。

相反,你应该做的是这样的:

std::vector<MyClass> objects;