【问题标题】:Can locally allocated memory be used for future uses?本地分配的内存可以用于将来使用吗?
【发布时间】:2018-12-04 18:12:00
【问题描述】:

代码

int main() {
  int test;
  cin >> test;
  while (test--) {
    int arr[100];
    arr[0] = 0;
  }
  return 0;
}

假设test = 3.
对于第一个测试用例,数组分配在地址1000。对于分配在2000 的第二个测试用例数组,依此类推。那么,如果我们有很多测试用例,我们之前分配的内存地址是否可以用于进一步分配?它会自动“释放()”我们之前分配的内存还是不能进一步使用?

【问题讨论】:

标签: c++


【解决方案1】:

arr 是具有块范围的自动变量。您只能在声明的块内使用它,获取它的地址等。这就是语言规范所说的。当我们进入区块时它“复活”,当我们退出离开区块时它就死了。 每次执行通过该块时都会发生这种情况;循环的每次迭代。

编译器利用 C++ 语言的这一要求。编译器很可能不会增加程序的内存使用量,而是为循环的每次迭代重用相同的存储空间。

【讨论】:

    【解决方案2】:

    如果您使用以下代码分配数组,您将在堆栈中分配内存。一旦您的代码到达范围的末尾(即大括号),堆栈就会弹出,您将无法再访问该部分内存。是的,它会自动释放。

    //anything here
    
    {
     int arr[100];
    }
    
    // can not access arr
    

    如果你想在大括号之后访问(我实际上是指改变范围),你需要在堆中为那个数组分配内存。您可以使用 new 关键字或 malloc() 来完成。但是这次你需要连续使用deletefree()来释放内存(不再自动释放)。

    //anything here
    int* arr
    {
      arr = new int[100];
    }
    
    // can access arr
    delete [] arr
    

    请记住,在堆栈中分配内存更快,但它的大小 是有限的。

    【讨论】:

    • 您的第二个示例无法真正访问arr
    【解决方案3】:

    如果您调用int arr[100],编译器将为您在堆栈中分配和释放内存(即,在退出变量所在的范围后它将被释放)。如果你想自己管理内存,你需要使用int *p = new int[100],内存将分配在你可以自己管理的heap中。内存将保持分配状态,直到您调用 delete[]。如果您不再需要内存后不使用delete[],您将得到内存泄漏

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2021-06-06
      • 2013-11-16
      相关资源
      最近更新 更多