返回填充有局部变量的向量是否安全?

2024-04-11

返回一个充满局部变量的向量是否安全?

例如,如果我有...

#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`
}

在这个例子中,我创建了多个Targetfor 循环中的实例,将它们推入向量,并返回指向它的指针。因为Target实例是在本地分配到堆栈的,这是否意味着返回的向量不安全,因为它引用堆栈上的对象(可能很快就会被覆盖等)?如果是这样,返回向量的推荐方法是什么?

顺便说一下,我是用 C++ 写的。


当您执行以下操作时,元素会被复制push_back将它们转化为向量(或分配给元素)。因此,您的代码是安全的 - 向量中的元素不是对局部变量的引用,它们由向量拥有。

此外,你甚至不需要返回一个指针(并且never处理原始指针,请改用智能指针)。只需返回一份副本即可;编译器足够聪明,可以对此进行优化,这样就不会产生实际的冗余副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回填充有局部变量的向量是否安全? 的相关文章

随机推荐