c++ - 将局部变量保存到全局向量中,为什么离开局部范围后我可以得到这些局部变量?
问题描述
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
将局部变量保存到全局向量中。离开局部作用域后,为什么我能得到这些局部变量?他们的记忆不应该被释放吗?
解决方案
您将局部变量的副本保存在全局容器中。
这是一个应该清楚的实验:
MyData my_data;
my_data.num = 1;
vec.push_back(my_data);
my_data.num = 2;
cout << vec[0].num << endl;
PS如果在变量超出范围后保留指向局部变量的指针,然后取消引用指针(即尝试检索变量的值),您可能会成功并获得旧值,这是未定义的行为,所以任何事情都可能发生,包括成功。
推荐阅读
- json - 当作为对象传入时,如何获取 ASP.NET MVC 中模型对象的属性值?
- hash - 如果我们知道 (md5) 散列的子字符串而没有暴力破解,是否有可能获得 (md5) 散列的盐?
- snowflake-cloud-data-platform - 在事务下执行的查询
- php - 如何在 PHP MVC 中实现分页?
- sql-server - 如何在存储过程中使用临时表?
- angular - 如何在模态关闭之前执行功能?
- asp.net-core - 在 Server 2008 R2 中从 .NET Core 调用 SOAP WCF 服务 (.NET 4.5.2) 时出现问题
- java - 使用 jupiter 的 java 参数化单元测试:更好地参考测试数据集
- python - 使用退出代码 -1073741819 (0xC0000005) 完成进程
- c - 动态矩阵相乘的分段错误(核心转储)