如果我在控制结构的块中定义一个变量,它是仅存在于该控制结构块的执行中而不是整个执行封闭函数中吗?
我如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况)?
后来添加: 在下面的代码中,我知道v scope是if block,但我想知道v是在if块的开始/结束的内存中还是在函数func的开始/结束时创建/销毁的?
void func ()
{
if (true)
{
int v;//automatic storage class
v = 1;
}
}
答案 0 :(得分:2)
如果我在控制结构的块中定义一个变量,它是仅存在于该控制结构块的执行中而不是整个执行封闭函数中吗?
这取决于您 声明 的位置,而不是 定义 。
该变量只能在您声明它的范围内访问。如果您明确传递可以超出范围,但是如果它仍然有效则取决于变量的存储类型。
例如:static
变量在整个程序生命周期内保持活动状态,而
从函数返回自动变量的地址将导致未定义的行为,因为该函数返回后变量不会保持有效。
好读: What is the difference between a definition and a declaration?
如何监控程序的确切内存使用情况及其更改(即:通过创建和销毁变量来改变内存使用情况)?
我相信您会希望获得有关动态分配对象的信息,因为自动对象只能在其范围内存活足够长时间,它们会自动销毁,因此它们通常不会导致任何问题。
对于动态对象您可以使用 valgrind with Massif 等内存分析工具,也可以使用replace new
and delete
operators for your class并收集诊断信息。
编辑:解决更新后的问题。
在下面的代码中,我知道
v
范围是if
块,但我想知道在{if}块的开头/结尾处的内存中是否创建/销毁v
或在函数func
的开头/结尾?
v
在声明它的作用域开始时以及声明它的语句被执行时创建。一旦范围结束,v
被销毁,即达到}
这个概念用于形成C ++中最广泛使用的概念之一的基础,称为 Resource Allocation is Initialization(RAII) 。每个C ++程序员绝对必须了解它。
通过这个小修改后的 code sample 来演示和验证对象的创建和销毁很简单:
#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 Destructor中 范围结束后 在调用func()
之后
答案 1 :(得分:0)
局部变量的范围受限于下面的所有代码 声明直到封闭块结束。变量也是 对原始块中包含的任何其他块可见。
答案 2 :(得分:0)
如果局部变量是一个对象,那么该对象的生命周期将在声明该变量的块的末尾结束。例如:
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)