在控制结构块中定义变量

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

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

稍后添加:在下面的代码中,我知道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

上一篇: defining variables in blocks of control structures

下一篇: Why should we overload/override new and delete?