关于动态内存的C ++

时间:2012-02-13 21:49:34

标签: c++

有什么区别:

int myArray[5];

int* myArray = new int[5];

5 个答案:

答案 0 :(得分:6)

int myArray[5]是一堆五个整数,具有自动(或静态)存储持续时间(本地内存,通常被归类为“堆栈中”)。退出特定范围时,本地内存在C ++中被清除。

int* myArray = new int[5]是一堆五个整数,具有动态存储持续时间(动态内存,通常被归类为“在堆中”)。退出特定范围时,动态内存不会被清除(myArray必须是一个int指针,用于存储动态创建的内存的位置)。

查看以下示例:

void foo(){
    int myArray[5];
}

void bar(){
    int* myArray_dynamic = new int[5];
}

int main(){
    foo();
    bar();
}

foo将使用堆栈内存,因此当foo返回/退出时,内存将自动释放。但是,动态分配的内存(位于myArray_dynamic bar中的位置将不会被释放,因为编译器只释放myArray_dynamic的内存,而不释放存储在new的内存。它的价值。

这会造成内存泄漏,因此对于new[]delete的每次使用都必须调用delete[]bar(除非您正在使用智能指针,但这是另一个问题)。

void bar(){ int* myArray_dynamic = new int[5]; delete[] myArray_dynamic; } 的正确版本

{{1}}

选择其中一个的主要原因是动态分配较慢,但可以是任何大小(自动数组必须具有固定的编译时大小),并且堆栈上的空间也是有限的,如果你用完了,very bad things happen

答案 1 :(得分:2)

第一个是一个数组,它是在执行函数期间静态分配或作为堆栈上的自动变量分配的内存块...它实际上取决于其声明/定义的上下文。

第二个不会编译: - )

说实话,你真的想要:

int* myArray = new int[5];

这意味着我们声明了一个指向整数数组的指针 - 类型变量,并且通过调用{{{}来调用堆上的C ++运行库动态分配整数数组。 1}},这是操作系统为您的进程分配变量的内存段。

答案 2 :(得分:2)

不同之处在于寿命。

int myArray[5];

这为int的数组5保留存储空间。如果在块作用域中声明myArray,则在声明它的块的末尾丢弃该数组。

int* myArray = new int[5];

这会动态分配int的数组5,该数组一直存在,直到它被delete []释放。

答案 3 :(得分:0)

  

有什么区别

一个是有效的。

另一个不是。

答案 4 :(得分:0)

在第二个你必须写

int* myArray = new int[5];

new返回指向堆中动态分配区域的指针。