如何在C / C ++中释放数组

Dr.*_*mer 4 c c++ memory-leaks memory-management

int main() {
    // Will this code cause memory leak?
    // Do I need to call the free operator?
    // Do I need to call delete?
    int arr[3] = {2, 2, 3};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. 此代码是否会造成内存泄漏?

  2. arr居住在哪里?在堆栈上还是在RAM中?

Vla*_*cow 6

在这个程序中

int main() {
    // Will this code cause memory leak?
    // Do I need to call the free operator?
    // Do I need to call delete?
    int arr[3] = {2, 2, 3};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

数组arr是函数main的局部变量,具有自动存储持续时间。函数完成工作后将销毁它。

函数本身在调用时分配了数组,退出该函数后它将销毁。

没有内存泄漏。

您既不能调用C函数,也不能调用操作符delete []。

如果程序看起来如下

int main() {
    int *arr = new int[3] {2, 2, 3};
    //...
    delete [] arr;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么您应该编写运算符delete [],如函数中所示。


Fab*_*ica 5

您必须free仅调用使用mallocdelete创建的对象new

在这种情况下,您不需要执行任何操作,该变量是自动管理的。一旦它超出范围(即,在本例中为 的末尾main()),其内存将被自动释放。

所以:

  1. 不,这里没有内存泄漏。
  2. 这个问题没有多大意义。所有变量都在 RAM 中。堆栈只是 RAM 内存的一个特殊部分,它的管理方式可以快速有效地处理函数调用、局部变量的自动分配/释放等。无论如何,是的,是在arr堆栈上创建的,而使用malloc或创建的变量new被认为位于“自由存储”或“堆”上。


cad*_*luk 0

不会导致内存泄漏,因为是局部变量(因此位于堆栈上),并且在到达arr右花括号时超出范围。main这意味着不需要调用freeor delete

您似乎误解了“RAM”一词。它只是表示“随机存取存储器”,可以指各种随机存取存储器,通常是PC的主存储器。堆栈与操作系统的自由存储或(运行时部分)一样,都是 RAM 的一部分。