C++ 在控制结构块中定义变量
如果我在控制结构的块内定义变量,它是否只存在于该控制结构的块的执行中,而不存在于封闭函数的整个执行中 另外,我如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况) 稍后添加: 在下面的代码中,我知道v的作用域是if块,但我想知道v是在if块的开始/结束或函数func的开始/结束时在内存中创建/销毁的C++ 在控制结构块中定义变量,c++,C++,如果我在控制结构的块内定义变量,它是否只存在于该控制结构的块的执行中,而不存在于封闭函数的整个执行中 另外,我如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况) 稍后添加: 在下面的代码中,我知道v的作用域是if块,但我想知道v是在if块的开始/结束或函数func的开始/结束时在内存中创建/销毁的 void func () { if (true) { int v;//automatic storage class v
void func ()
{
if (true)
{
int v;//automatic storage class
v = 1;
}
}
如果我在控制结构的块内定义变量,它是否只存在于该控制结构的块的执行中,而不存在于封闭函数的整个执行中
这取决于您在哪里声明变量,而不是定义变量
变量只能在声明它的范围内访问。如果显式传递它,则可以在tht范围之外访问它,但如果它仍然有效,则取决于变量的存储类型。例如:
static
变量在整个程序生命周期内保持活动状态,而,从函数返回自动变量的地址将导致未定义的行为,因为该变量在函数返回后不保持有效 好书: 如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况) 我相信您会希望获得动态分配对象的信息,因为自动对象在其作用域中的寿命足够长,它们会自动销毁,所以通常不会导致任何问题 对于动态对象,您可以使用内存分析工具,如,也可以使用内存分析工具收集诊断信息
编辑:以解决更新的Q 在下面的代码中,我知道
v
范围是if
块,但我想知道v
是在if块的开始/结束处还是在函数func
的开始/结束处在内存中创建/销毁的
v
是在声明它的范围开始并执行声明它的语句时创建的<一旦作用域结束,即到达}
时,code>v将被销毁。这个概念用于形成C++中使用最广泛的概念之一,称为<强> <强>。每个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;
}
#包括
类Myclass
{
公众:
Myclass(){std::cout
局部变量的作用域仅限于
声明,直到封闭块结束。变量也是
对包含在原始块中的任何其他块可见
如果局部变量是一个对象,则该对象的生存期在声明该变量的块结束时结束。例如:
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)
你自己试试看:if(true){int x;}x=5;
我注意到你强调了“如果局部变量是一个对象”,有什么具体的理由这么说吗?如果对象是一个内置的数据类型,比如说int
,有什么区别吗?@Als:不是所有的变量都是对象,例如引用。(也不是所有的对象都是变量。)