循环和调用堆栈
Loops and the call stack
如果我在循环中使用以下:
ostringstream glob;
glob << "some words";
cout<< "this is bob"<<glob.str()<<endl;
glob 在每次迭代时都会重置。 但是,如果我在循环外声明 glob,那么每次迭代都会不断添加"一些单词",从而导致字符串越来越长。
我试图理解为什么。 这是因为每次循环运行时,此变量都会从堆栈中弹出吗?
我以为如果我在每个循环中"红声明"glob,那么我会收到一个错误,但我没有......
如果你在作用域内声明变量,那么每次你进入循环(它在堆栈上)时都会创建(构造)它。如果你在循环之外声明它,而不是你继续重用的单个实例。
另请参阅:
- C++范围
- 构造函数和析构函数概述
澄清一下,您正在询问这两者之间的区别:
ostringstream glob;
for ( int i = 0; i < 100; ++i )
{
glob << "some words";
cout<< "this is bob"<<glob.str()<<endl;
}
而这个:
for ( int i = 0; i < 100; ++i )
{
ostringstream glob;
glob << "some words";
cout<< "this is bob"<<glob.str()<<endl;
}
首先,"glob"在循环之前初始化一次,因为它的作用域在循环体之外。在第二个"glob"中,它位于循环体中(在定义循环范围的大括号内),因此被新放置在堆栈上并在每次迭代时初始化(并在每次迭代结束时销毁)。
当 glob 在循环内时,它的作用域是循环的每次迭代。因此,当它超出范围时,它将被删除(从堆栈中弹出),并在下一次迭代中重新创建(推送到堆栈上)。
当 glob 在循环之外时,它的作用域是方法,在方法完成之前不会删除它。
相关文章:
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- 是否可以检查悬挂光纤的调用堆栈?
- MSVC __debugbreak() 与 openGL 错误回调一起使用时不会产生调用堆栈
- 了解使用堆栈实现队列的递归调用机制
- C++析构函数调用两次,堆栈分配的复合对象
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- C/C++中全局调用堆栈的基础
- 是否可以访问代码中的调用堆栈?
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 调用堆栈显示 SIGBUS,这意味着什么
- 堆栈展开如何与析构函数调用有关?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 从基类堆栈调用派生类实例
- 堆栈调用析构函数,即使遵循三规则
- 用于生成函数以从运行时堆栈调用带参数的函数的模板