当我初始化一个大小为变量的数组时会发生什么?
What happens when I initialize an array having the size as a variable?
我想知道我的数组存储在哪里,如果它具有可变大小,例如在下面的代码中,这是因为在我的教科书中它说在运行时内存被分配给堆,据我所知,但似乎它实际上分配给了堆栈 有人可以澄清堆栈和堆内存分配实际上是如何工作的。
#include<iostream>
using namespace std;
int main(){
int Array_size;
cin >> Array_size;
int array[Array_size];
return 0;
}
你的书错了,或者你看错了。
A Variable-Length Array(少数 C++ 编译器实现的 非标准扩展)总是分配在 自动内存(即,在堆栈上),永远不会在 动态内存 中(即,在堆上)。当数组超出范围时,编译器会回收数组的内存,就像任何其他局部变量一样。
动态内存仅由 the new
operator 或 [std::](m|c)alloc()
函数分配。
栈和堆内存有点抽象,所以我理解你的困惑。通常,函数内的任何变量,包括 main,不是动态分配的(即使用 new 声明变量)进入堆栈。如果您声明一个指针,则该指针指向堆上的一个变量,而该指针仍保留在堆栈上。这就是为什么您必须始终使用 delete 清除指针,最好将指针设置为 NULL(如果它不再有用)。压入堆栈的任何变量或函数都会自动弹出(将 push 和 pop 视为插入和移除,这只是正确的术语)。堆上的内存是在运行时手动分配和释放的。希望这能消除一些困惑。
我想知道我的数组存储在哪里,如果它具有可变大小,例如在下面的代码中,这是因为在我的教科书中它说在运行时内存被分配给堆,据我所知,但似乎它实际上分配给了堆栈 有人可以澄清堆栈和堆内存分配实际上是如何工作的。
#include<iostream>
using namespace std;
int main(){
int Array_size;
cin >> Array_size;
int array[Array_size];
return 0;
}
你的书错了,或者你看错了。
A Variable-Length Array(少数 C++ 编译器实现的 非标准扩展)总是分配在 自动内存(即,在堆栈上),永远不会在 动态内存 中(即,在堆上)。当数组超出范围时,编译器会回收数组的内存,就像任何其他局部变量一样。
动态内存仅由 the new
operator 或 [std::](m|c)alloc()
函数分配。
栈和堆内存有点抽象,所以我理解你的困惑。通常,函数内的任何变量,包括 main,不是动态分配的(即使用 new 声明变量)进入堆栈。如果您声明一个指针,则该指针指向堆上的一个变量,而该指针仍保留在堆栈上。这就是为什么您必须始终使用 delete 清除指针,最好将指针设置为 NULL(如果它不再有用)。压入堆栈的任何变量或函数都会自动弹出(将 push 和 pop 视为插入和移除,这只是正确的术语)。堆上的内存是在运行时手动分配和释放的。希望这能消除一些困惑。