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

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; } 
  1. 这段代码是否会造成内存泄漏?

  2. arr在哪里居住? 在堆栈或RAM中?

在这个计划中

 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; } 

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

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

没有内存泄漏。

您不应该既不调用C函数也不调用操作符删除[]。

如果程序看起来如下

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

那么你应该写函数中显示的operator delete []。

堆栈在RAM中。

不,它不会泄漏内存。 是的,数组通常是“在堆栈上”(即,实现分配局部变量的任何地方,即使硬件可能不提供对堆栈的直接支持,也需要具有类似堆栈的行为)。

您必须仅为使用malloc创建的对象调用free ,并为使用new创建的对象调用delete

在这种情况下,您无需执行任何操作,此变量将自动管理。 一旦超出范围(即,在这种情况下,在main()的末尾),它的内存将自动释放。

所以:

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

不会导致内存泄漏,因为arr是一个局部变量(因此位于堆栈中),并且在达到main的右大括号时超出范围。 这意味着无需呼叫freedelete

你好像误解了“RAM”这个词。 它只是意味着“随机存取存储器”,它可以指各种随机存取的存储器,通常是PC的主存储器。 堆栈也是操作系统的免费存储或(运行时部分)的RAM的一部分。