【问题标题】:How to free an array in C/C++ [closed]如何在 C/C++ 中释放数组 [关闭]
【发布时间】:2016-01-24 22:58:35
【问题描述】:
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 中?

【问题讨论】:

  • C 和 C++ 是两种完全不同的语言。你用的是哪一个?

标签: c++ c memory-management memory-leaks


【解决方案1】:

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

在这种情况下你不需要做任何事情,这个变量是自动管理的。一旦超出范围(即在这种情况下,在main() 的末尾),它的内存将被自动释放。

所以:

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

【讨论】:

  • 感谢您的澄清。如果我要初始化一个 const char * str = "abc" 或 char str [] = "abc",它也会驻留在堆栈上吗?
【解决方案2】:

在这个节目中

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 函数 free 和操作符 delete []。

如果程序如下所示

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

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

【讨论】:

  • 删除操作符如何知道数组的大小?
  • @Dr.Programmer - 可能是魔法。语言标准并没有说明它如何 工作,只是说它必须 工作。实际上,大小存储在某个地方,但我们不应该打扰。
  • @Dr.Programmer 通常它的实现方式是编译器将前缀附加到包含数组中元素数量的内存块。
【解决方案3】:

堆栈在 RAM 中。

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

【讨论】:

  • 感谢您的澄清。如果我要初始化一个 const char * str = "abc" 或 char str [] = "abc",它也会驻留在堆栈上吗?
  • 假设第一个在函数内部,指针将作为本地分配,但字符串文字将静态分配(例如,通常在初始化的数据段中)。在第二个中,您将拥有一个静态分配的字符串文字和一个本地分配的数组。字符串文字将用于在进入其所在的函数(或任何块)时初始化本地数组。
【解决方案4】:

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

您似乎误解了“RAM”一词。它的意思是“随机存取存储器”,它可以指各种随机存取的内存,通常是 PC 的主内存。堆栈是 RAM 的一部分,就像免费存储或操作系统的(运行时部分)一样。

【讨论】:

  • 感谢您的澄清。如果我要初始化一个 const char * str = "abc" 或 char str [] = "abc",它也会驻留在堆栈上吗?
  • @Dr.Programmer 字符串文字存储在堆栈中,除非用于初始化像char str[] = "abc"; 这样的数组。因此,您的第一个示例不在堆栈上,但可能与程序代码或某些数据一起在只读内存中,您的第二个示例在堆栈上。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 2015-06-17
  • 2012-10-08
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多