在控制结构块中定义变量
如果我在控制结构的块中定义一个变量,它是否仅存在于该控制结构块的执行中,而不存在于封闭函数的整个执行中?
我该如何监视程序及其更改的确切内存使用情况(即:通过创建和销毁变量来改变内存使用情况)?
稍后添加:在下面的代码中,我知道v范围是if块,但我想知道v是在if块的开始/结束处还是在函数func的开始/结束处在内存中创建/销毁?
void func ()
{
if (true)
{
int v;//automatic storage class
v = 1;
}
}
如果我在控制结构的块中定义一个变量,它是否仅存在于该控制结构块的执行中,而不存在于封闭函数的整个执行中?
这取决于你声明变量的位置没有定义它。
该变量只能在声明它的范围内访问。 如果你明确地将它传递过来,它可以在范围之外访问,但是如果它仍然有效,则取决于变量的存储类型。
例如: static
变量在整个程序生命周期中保持有效,
从函数返回自动变量的地址会导致未定义行为,因为变量在函数返回后不会保持有效。
良好阅读:定义和声明有什么区别?
我如何监视程序及其更改的确切内存使用情况(即:通过创建和销毁变量来改变内存使用情况)?
我相信你会想获得有关动态分配对象的信息,因为自动对象只在其作用域内存在足够长的时间,它们会自动销毁,所以通常不会引起任何问题。
对于动态对象您可以使用内存分析工具(如Valgrind和Massif),或者可以替换类的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)
链接地址: http://www.djcxy.com/p/73043.html