返回由局部变量填充的 vector 是否安全?
例如,如果我有...
#include <vector>
struct Target
{
public:
int Var1;
// ... snip ...
int Var20;
};
class Test
{
public:
std::vector<Target> *Run(void)
{
std::vector<Target> *targets = new std::vector<Target>;
for(int i=0; i<5; i++) {
Target t = Target();
t.Var1 = i;
// ... snip ...
t.Var20 = i*2; // Or some other number.
targets->push_back(t);
}
return targets;
}
};
int main()
{
Test t = Test();
std::vector<Target> *container = t.Run();
// Do stuff with `container`
}
在此示例中,我将在for循环中创建多个
Target
实例,将其插入 vector ,然后返回指向它的指针。因为Target
实例是在本地分配给堆栈的,这是否意味着返回的 vector 是不安全的,因为它引用了堆栈上的对象(可能很快就会被覆盖等)?如果是这样,建议的返回 vector 的方法是什么?顺便说一下,我是用C++编写的。
最佳答案
将push_back
元素到 vector (或分配给元素)时,元素将被复制。因此,您的代码是安全的– vector 中的元素不引用局部变量,它们归 vector 所有。
此外,您甚至不需要返回指针(再也不处理原始指针,而应使用智能指针)。只需返回一份副本即可;编译器足够聪明,可以对此进行优化,因此不会产生实际的冗余副本。