如果我在控制结构的块内定义一个变量,它是否只存在于该控制结构块的执行中而不存在于封闭函数的整个执行中?
这取决于您在哪里声明变量而不是定义它。
该变量只能在您声明它的范围内访问。如果你明确地传递它,它可以在范围之外访问,但它是否仍然有效将取决于变量的存储类型。
例如: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() 之后