4

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

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

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

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

3 回答 3

2

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

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

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

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

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

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

对于动态对象您可以使用内存分析工具(如valgrind 和 Massif ) ,或者您可以为您的类替换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() 之后

于 2012-05-20T15:49:30.827 回答
0

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

更多信息

于 2012-05-20T15:58:18.483 回答
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)
于 2012-05-20T16:11:42.920 回答