Stack std :: vector scope

im new для c ++, и я нахожу трудно понять некоторые векторные поведения. Я пытался реализовать функцию для возврата массива int, и я нашел много предложений использовать такой вектор:

vector myFunc()
{
    vector myVector;
    //add elements to vector here...
    return myVector;
}

Но из того, что я знаю, «myVector» - это объект, созданный в стеке, так разве это не выходит за рамки, когда функция заканчивается? когда его деструктор называется? Я знаю, что есть несколько других вопросов о возвращении векторов, но мне нужно прояснить этот конкретный момент, надеясь, что не будет дублировать вопрос.

4
добавлено
Просмотры: 1
de
Он копируется/перемещается (или оптимизируется). Он возвращает адрес или ссылку на локальный объект, который может вызвать проблемы.
добавлено автор chris, источник
Есть множество вопросов по этому вопросу. вы можете найти их ( образец ) просвещать.
добавлено автор WhozCraig, источник

3 ответы

Да, потому что myVector выделяется в стеке, как только функция возвращается, она выходит за пределы области видимости. Но в этом случае все в порядке! Ваша подпись функции

vector myFunc()

который возвращает копию из myVector , поэтому не имеет значения, что он выходит из сферы действия, поскольку он уже скопирован для возврата.

Однако, если вы изменили его на нечто вроде

vector & myFunc()

теперь вы говорите ему не копировать myVector , и у вас будет проблема с именем dangling reference , так как myVector будет разрушен, и вы не скопируйте его, но попробуйте его использовать.

9
добавлено
Это справедливо для любого хорошо спроектированного контейнера класса, следующего за правилом 3 (или с C ++ 11 5). Для классов без внутренних динамических данных они получат это бесплатно.
добавлено автор jozefg, источник
так это вектор-специфический? я имею в виду, это нормально, потому что у вектора есть блок затрат на копирование, который также дублирует динамические выделенные внутренние данные?
добавлено автор Michele M., источник

Он выходит из области видимости, но когда вы возвращаете класс или структуру, компилятор автоматически создает для вас копию, так что ваш принимающий объект заполняется содержимым исходного объекта.

Похожий на:

vector a;
vector b;

... fill in vector a with stuff ... 

b = a; 
0
добавлено

Ваш код возвращает копию экземпляра myVector в стеке. Так что это нормально, он выходит из области действия и удаляется (после возврата).

0
добавлено
скопированы или перемещены, в зависимости от того, поддерживается ли C ++ 11 ctors.
добавлено автор miguel.martin, источник