Как продлить время жизни локальной переменной внутри функции?

#variables #constructor #local #move

#переменные #конструктор #Местные новости #переместить

Вопрос:

Смотрите код ниже. v1 — это локальная переменная внутри функции. Соответственно, после выхода из этой функции эта переменная должна быть уничтожена. Таким образом, конструктор перемещения должен столкнуться с проблемой в основной функции. Но на самом деле результат противоположный. В основной функции я вижу содержимое v1.

 #include <iostream>

#include <vector>

using namespace std;

void my_fn(vector<vector<int>> amp; v) {
    vector<int> v1 = {1, 2, 3};
    v.push_back(move(v1));
    cout << " " << endl;
}

int main(){
    vector<vector<int>>  v;
    my_fn(v);
    for(const auto amp; e:v)
        for (const auto e1: e)
            cout << e1 << endl;

    return 0;
}
  

Ответ №1:

Когда вы перемещаете содержимое v1 в v , v1 еще не уничтожается, потому что это происходит прямо перед закрывающей скобкой функции my_fn . В результате содержимое v1 помещается в v файл, который берется по ссылке. Область действия v1 не расширяется, но ее содержимое просто копируется.

Комментарии:

1. Моя интуиция похожа на вашу. Но, строго говоря, место для хранения v1 находится в стеке, верно? После выхода из функции это пространство должно быть освобождено, верно?

2. Ну, элементы данных v1 действительно находятся в стеке, но элементы массива хранятся в куче, потому что это вектор, а не массив. Пространство, занимаемое v1 в куче и в стеке, освобождается после копирования с помощью push_back и перемещения в память, принадлежащую v.

3. также обратите внимание, что здесь я использовал конструктор перемещения.

4. Это ничего не меняет, поскольку v не может использовать память v1, поскольку вы добавляете элементы v1 к v.

5. Таким образом, новая память всегда будет выделяться, поскольку v должен содержать как ее элементы, так и элементы v1.