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)
此代码是否会造成内存泄漏?
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;
}
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 [],如函数中所示。
您必须free仅调用使用malloc和delete创建的对象new。
在这种情况下,您不需要执行任何操作,该变量是自动管理的。一旦它超出范围(即,在本例中为 的末尾main()),其内存将被自动释放。
所以:
arr堆栈上创建的,而使用malloc或创建的变量new被认为位于“自由存储”或“堆”上。不会导致内存泄漏,因为是局部变量(因此位于堆栈上),并且在到达arr右花括号时超出范围。main这意味着不需要调用freeor delete。
您似乎误解了“RAM”一词。它只是表示“随机存取存储器”,可以指各种随机存取存储器,通常是PC的主存储器。堆栈与操作系统的自由存储或(运行时部分)一样,都是 RAM 的一部分。