Variables 如何延长函数中局部变量的生存期?

Variables 如何延长函数中局部变量的生存期?,variables,constructor,local,move,Variables,Constructor,Local,Move,请参阅下面的代码。v1是函数内部的局部变量。因此,在离开此函数后,应终止此变量。因此,move构造函数应该在main函数中遇到问题。但实际上结果恰恰相反。在main函数中,我可以看到v1的内容 #include <iostream> #include <vector> using namespace std; void my_fn(vector<vector<int>> & v) { vector<int> v1

请参阅下面的代码。v1是函数内部的局部变量。因此,在离开此函数后,应终止此变量。因此,move构造函数应该在main函数中遇到问题。但实际上结果恰恰相反。在main函数中,我可以看到v1的内容

#include <iostream>

#include <vector>

using namespace std;

void my_fn(vector<vector<int>> & 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 & e:v)
        for (const auto e1: e)
            cout << e1 << endl;

    return 0;
}
#包括
#包括
使用名称空间std;
无效我的_fn(向量和v){
向量v1={1,2,3};
v、 推回(移动(v1));

cout当您将
v1
的内容移动到
v
中时,
v1
尚未被销毁,因为这发生在函数
my_fn
的结束括号之前。因此,
v1
的内容被推到引用的
v
中。
v1
的范围没有扩展当你将
v1
的内容移动到
v
中时,
v1
还没有被销毁,因为这发生在函数
my_fn
的右括号之前。因此,
v1
的内容被推到
v
中作为参考。范围v1的
没有扩展,只是复制了它的内容。

我的直觉和你的一样。但严格来说,v1的存储空间在堆栈上,对吗?离开函数后,应该回收这个空间,对吗?嗯,v1的数据成员确实在堆栈上,但是数组成员存储在堆栈上,因为它是vector而不是数组。v1在堆和堆栈上所占的空间在被push_back复制并移动到v拥有的内存中后被回收。还要注意,这里我使用了一个移动构造函数。这不会改变任何东西,因为v无法使用v1的内存,因为您将v1的元素添加到v中。所以新内存总是没有o分配,因为v必须同时包含它的元素和v1的元素。我的直觉与你相似。但严格来说,v1的存储空间在堆栈上,对吗?离开函数后,应该回收这个空间,对吗?嗯,v1的数据成员确实在堆栈上,但数组成员存储在堆栈上,因为它这是一个向量而不是数组。v1在堆上和堆栈上的空间在被push_back复制并移动到v拥有的内存中后被回收。还要注意,这里我使用了一个移动构造函数。这不会改变任何东西,因为v不能使用v1的内存,因为你将v1的元素附加到v上。所以新内存将始终是h由于v必须同时包含它的元素和v1的元素,所以必须分配ave。