Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在控制结构块中定义变量_C++ - Fatal编程技术网

C++ 在控制结构块中定义变量

C++ 在控制结构块中定义变量,c++,C++,如果我在控制结构的块内定义变量,它是否只存在于该控制结构的块的执行中,而不存在于封闭函数的整个执行中 另外,我如何监控程序的确切内存使用情况及其变化(即:通过创建和销毁变量来改变内存使用情况) 稍后添加: 在下面的代码中,我知道v的作用域是if块,但我想知道v是在if块的开始/结束或函数func的开始/结束时在内存中创建/销毁的 void func () { if (true) { int v;//automatic storage class v

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

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

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

void func ()
{
    if (true)
    {
        int v;//automatic storage class
        v = 1;
    }
}
如果我在控制结构的块内定义变量,它是否只存在于该控制结构的块的执行中,而不存在于封闭函数的整个执行中

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

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

好书:

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

我相信您会希望获得动态分配对象的信息,因为自动对象在其作用域中的寿命足够长,它们会自动销毁,所以通常不会导致任何问题

对于动态对象,您可以使用内存分析工具,如,也可以使用内存分析工具收集诊断信息


编辑:以解决更新的Q

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

v
是在声明它的范围开始并执行声明它的语句时创建的<一旦作用域结束,即到达
}
时,code>v将被销毁。
这个概念用于形成C++中使用最广泛的概念之一,称为<强> <强>。每个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;
}
#包括
类Myclass
{
公众:
Myclass(){std::cout
局部变量的作用域仅限于
声明,直到封闭块结束。变量也是
对包含在原始块中的任何其他块可见

如果局部变量是一个对象,则该对象的生存期在声明该变量的块结束时结束。例如:

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)

你自己试试看:
if(true){int x;}x=5;
我注意到你强调了“如果局部变量是一个对象”,有什么具体的理由这么说吗?如果对象是一个内置的数据类型,比如说
int
,有什么区别吗?@Als:不是所有的变量都是对象,例如引用。(也不是所有的对象都是变量。)