在控制结构块中定义变量

defining variables in blocks of control structures

本文关键字:定义 变量 控制结构      更新时间:2023-10-16

如果我在控制结构的块内定义一个变量,它是否只存在于该控制结构块的执行中,而不是存在于封闭函数的整个执行中?

另外,如何监视程序的确切内存使用情况及其更改(即:通过创建和销毁变量来更改内存使用情况(?

后来添加:在下面的代码中,我知道 v 范围是 if 块,但我想知道 v 是在 if 块的开始/结束时还是在函数函数的开始/结束时在内存中创建/销毁的?

void func ()
{
    if (true)
    {
        int v;//automatic storage class
        v = 1;
    }
}
如果我在控制结构的块

内定义一个变量,它是否只存在于该控制结构块的执行中,而不存在于封闭函数的整个执行中?

这取决于你在哪里声明变量而不是定义它。

该变量只能在声明它的作用域中访问。如果您显式传递它,则可以在范围之外访问它,但如果它仍然有效,则取决于变量的存储类型
例如:static变量在整个程序生命周期中保持活动状态,而
从函数返回自动变量的地址将导致未定义行为,因为变量在函数返回后不再有效。

好读:定义和声明有什么区别?

如何监视程序的确切内存使用情况及其更改(即:通过创建和销毁变量来更改内存使用情况(?

我相信您会希望获得有关动态分配对象的信息,因为自动对象在其范围内只存在足够长的时间,它们会自动销毁,因此它们通常不会引起任何问题。

对于动态对象,您可以使用内存分析工具(如带有 Massif(的 valgrind,也可以替换类的newdelete运算符并收集诊断信息。


编辑:解决更新的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)