在控制结构块中定义变量

时间:2012-05-20 15:48:11

标签: c++

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

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

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

void func ()
{
    if (true)
    {
        int v;//automatic storage class
        v = 1;
    }
}

3 个答案:

答案 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)

  

局部变量的范围受限于下面的所有代码   声明直到封闭块结束。变量也是   对原始块中包含的任何其他块可见。

More info

答案 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)