在控制结构块中定义变量
defining variables in blocks of control structures
如果我在控制结构的块内定义一个变量,它是否只存在于该控制结构块的执行中,而不是存在于封闭函数的整个执行中?
另外,如何监视程序的确切内存使用情况及其更改(即:通过创建和销毁变量来更改内存使用情况(?
后来添加:在下面的代码中,我知道 v 范围是 if 块,但我想知道 v 是在 if 块的开始/结束时还是在函数函数的开始/结束时在内存中创建/销毁的?
void func ()
{
if (true)
{
int v;//automatic storage class
v = 1;
}
}
如果我在控制结构的块内定义一个变量,它是否只存在于该控制结构块的执行中,而不存在于封闭函数的整个执行中?
这取决于你在哪里声明变量而不是定义它。
该变量只能在声明它的作用域中访问。如果您显式传递它,则可以在范围之外访问它,但如果它仍然有效,则取决于变量的存储类型。
例如:static
变量在整个程序生命周期中保持活动状态,而
从函数返回自动变量的地址将导致未定义行为,因为变量在函数返回后不再有效。
好读:定义和声明有什么区别?
如何监视程序的确切内存使用情况及其更改(即:通过创建和销毁变量来更改内存使用情况(?
我相信您会希望获得有关动态分配对象的信息,因为自动对象在其范围内只存在足够长的时间,它们会自动销毁,因此它们通常不会引起任何问题。
对于动态对象,您可以使用内存分析工具(如带有 Massif(的 valgrind,也可以替换类的new
和delete
运算符并收集诊断信息。
编辑:解决更新的Q。
在下面的代码中
v
我知道范围是if
块,但我想知道v
是在 if 块的开始/结束时还是在函数func
的开始/结束时在内存中创建/销毁的?
v
是在声明它的作用域启动并执行声明它的语句时创建的。 一旦范围结束,即达到}
,v
就会被销毁。
此概念用于形成C++称为资源分配的最广泛使用的概念之一是初始化 (RAII( 的基础。每个C++程序员都必须知道这一点。
通过这个修改后的小代码示例演示和验证对象的创建和销毁非常简单:
#include<iostream>
class Myclass
{
public:
Myclass(){std::cout<<"nIn Myclass Constructor ";}
~Myclass(){std::cout<<"nIn Myclass Destructor";}
};
void func()
{
std::cout<<"nBefore Scope Begins";
if (true)
{
Myclass obj;//automatic storage class
}
std::cout<<"nAfter Scope Ends";
}
int main()
{
std::cout<<"nBefore Calling func()";
func();
std::cout<<"nAfter Calling func()";
return 0;
}
输出为:
在调用 func((
之前 范围开始
之前 在 Myclass 构造函数中
在 Myclass 析构函数
中 范围结束后
调用 func(( 之后
局部变量的范围仅限于 声明直到封闭块结束。该变量也是 对包含在原始块中的任何其他块可见。
更多信息
如果局部变量是一个对象,则该对象的生存期在声明该变量的块的末尾结束。例:
Foo x; // lifetime of "x" begins
{
some_stuff();
Foo y; // lifetime of "y" begins
Foo & a = x; // local variable "a", no new object
more_stuff();
} // lifetime of "y" ends; "y" and "a" go out of scope
// (lifetime of "x" ends with its surrounding scope,
// or end of program if it was global)
- 在头文件中定义变量不会出错
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 在命名空间中定义变量
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用不同类型重新定义变量
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 定义变量类型
- 在命名空间中定义变量,但在测试中获取空值
- cmake没有定义变量
- C 中的继承:在亲子类中定义变量
- 在同一函数中定义变量及其静态等效项
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 如何将 int 和 int* 传递到函数中以定义变量
- 在定义变量时调用类函数
- 定义变量与模板
- 定义变量类型
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- C 如何基于另一个变量和某些算术定义变量的值
- C 可以指向具有定义变量的函数
- C 定义变量设置值