Zet*_*eta 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();
}
Run Code Online (Sandbox Code Playgroud)

foo将使用堆栈内存,因此当foo返回/退出时,内存将自动释放.但是,动态分配的内存,其位置存储在myArray_dynamicbar不会得到释放,因为编译器将仅释放的内存myArray_dynamic,而不是一个储存在它的价值的内存.

这将产生内存泄漏,因此对于每次使用newnew[]必须调用deletedelete[](除了您正在使用智能指针,但这是另一个问题).

正确的版本bar

void bar(){
    int* myArray_dynamic = new int[5];
    delete[] myArray_dynamic;
}
Run Code Online (Sandbox Code Playgroud)

选择其中一个的主要原因是动态分配较慢,但可以是任何大小(自动数组必须具有固定的编译时大小),并且堆栈上的空间也是有限的,如果用完,非常糟糕的事情发生.

  • 我认识的大多数人都说"在堆栈上"是指自动存储持续时间.正如你所指出的,实际上是否真的在实际堆栈上是一个实现细节; 我们不关心那里是否存在实际的堆栈.除非您正在讨论底层实现实际上很重要的上下文,否则说"堆栈"是一个快速且易于理解的简写,表示您实际意味着什么.虽然它可能并不总是技术上最正确的措辞选择,但它通常是*最佳*选择. (3认同)