循环后变量的记忆会发生什么? (C ++)

时间:2014-04-21 07:51:01

标签: c++ memory

我试图了解C ++的工作原理。当你在循环中声明一个新变量(int x)时,例如在for循环中。内存被分配给循环中的变量x,但退出for循环后该内存会发生什么?我对朋友的理解是Java会自动解除内存的分配,但是C ++呢?

感谢。

3 个答案:

答案 0 :(得分:4)

如果在堆栈上声明(即通过int x = ...)并且变量离开其范围,它将被释放。如果在堆上声明(即通过int *x = new int(...)),它将无法解除分配。在这种情况下,您必须明确使用delete运算符。

答案 1 :(得分:1)

在C ++中,局部变量在超出范围时会自动销毁。如果您在for循环内声明了变量,那么当循环退出或前进到下一次迭代时它将被销毁。

请注意,这不适用于在堆上分配的对象(例如,使用newstd::malloc());他们需要被明确销毁。

答案 2 :(得分:1)

以下是c ++中的3种可能情况:

  1. 静态内存,其中对象在程序的持续时间内由链接器分配。函数中的全局变量和名称空间变量,静态类成员和静态变量在静态内存中分配。在静态内存中分配的对象构造一次并持续到程序的末尾。例如:

    void f() {
        for (;;) { 
            static int i = 0; //memory will not be deallocated until the program ends.
        }
    }
    
  2. 自动存储器,其中分配了函数参数和局部变量。每个条目 进入函数或块获取自己的副本。当它超出范围时,会自动创建和销毁这种内存;因此名称自动记忆。自动内存也被称为“在堆栈中”。例如:

    void f() {
        for (;;) { 
            int i = 0; //memory will be deallocated when get out of the loop's scope.
        }
    }
    
  3. 免费存储,程序明确请求对象的内存以及a 程序完成后可以再次释放内存(使用newdelete)。免费存储也称为动态内存或堆。 例如:

    void f() {
        for (;;) { 
            int * pi = new int; //memory newed will not be deallocated until delete called.
                                //memory of the pointer self will be deallocated when get out of the loop's scope, same as case 2.
        }
    }