有什么区别:
int myArray[5];
Run Code Online (Sandbox Code Playgroud)
和
int* myArray = new int[5];
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
foo将使用堆栈内存,因此当foo返回/退出时,内存将自动释放.但是,动态分配的内存,其位置存储在myArray_dynamic中bar不会得到释放,因为编译器将仅释放的内存myArray_dynamic,而不是一个储存在它的价值的内存.
这将产生内存泄漏,因此对于每次使用new或new[]必须调用delete或delete[](除了您正在使用智能指针,但这是另一个问题).
正确的版本bar是
void bar(){
int* myArray_dynamic = new int[5];
delete[] myArray_dynamic;
}
Run Code Online (Sandbox Code Playgroud)
选择其中一个的主要原因是动态分配较慢,但可以是任何大小(自动数组必须具有固定的编译时大小),并且堆栈上的空间也是有限的,如果用完,非常糟糕的事情发生.
| 归档时间: |
|
| 查看次数: |
126 次 |
| 最近记录: |