首页 > 解决方案 > 将局部变量保存到全局向量中,为什么离开局部范围后我可以得到这些局部变量?

问题描述

class MyData
{
    public:
        string str;
        int num;
};

vector<MyData> vec;

void Generate_data()
{
    for (int i = 0; i < 3; ++i)
    {
        ostringstream oss("");
        oss << "str " << i;
        MyData my_data;

        my_data.num = i;
        my_data.str = oss.str();

        vec.push_back(my_data);
    }
}

int main()
{
    Generate_data();

    for (int i = 0, size = vec.size(); i < size; ++i)
    {
        cout << vec[i].num << ": " << vec[i].str << endl;
    }

    return 0;
}

输出:

0: str 0
1: str 1
2: str 2

将局部变量保存到全局向量中。离开局部作用域后,为什么我能得到这些局部变量?他们的记忆不应该被释放吗?

标签: c++

解决方案


您将局部变量的副本保存在全局容器中。

这是一个应该清楚的实验:

MyData my_data;
my_data.num = 1;
vec.push_back(my_data);
my_data.num = 2;
cout << vec[0].num << endl;

PS如果在变量超出范围后保留指向局部变量的指针,然后取消引用指针(即尝试检索变量的值),您可能会成功并获得旧值,这是未定义的行为,所以任何事情都可能发生,包括成功。


推荐阅读