Безопасно ли возвращать вектор, заполненный локальными переменными? - PullRequest
9 голосов
/ 16 февраля 2012

Безопасно ли возвращать вектор, заполненный локальными переменными?

Например, если у меня есть ...

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

В этом примере я создаю несколько Target экземпляров в цикле for, помещая их в вектор и возвращаяуказатель на это.Поскольку экземпляры Target были выделены локально для стека, означает ли это, что возвращаемый вектор небезопасен, поскольку он ссылается на объекты в стеке (которые могут вскоре быть перезаписаны и т. Д.)?Если так, каков рекомендуемый способ вернуть вектор?

Кстати, я пишу это на C ++.

1 Ответ

19 голосов
/ 16 февраля 2012

Элементы копируются, когда вы push_back копируете их в вектор (или присваиваете элементам).Поэтому ваш код безопасен - элементы в векторе не являются ссылками на локальные переменные, они принадлежат вектору.

Более того, вам даже не нужно возвращать указатель (и never обрабатывать необработанные указатели, вместо этого используйте умные указатели).Просто верните копию вместо этого;компилятор достаточно умен, чтобы оптимизировать это так, чтобы не создавалась избыточная копия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...