没有任何多余的理论。如果我写:
int* t = new int[10]; //stack or heap is beign used?
再次
int t[10];// stack or heap is beign used?
答案 0 :(得分:6)
int* t = new int[10]; // Heap
int t[10]; // Stack
注意,正如注释中所指出的,第一个示例在堆上分配内存,但仍需要堆栈变量t
来存储指向已分配内存的指针。这意味着t
在超出范围时将被销毁,但它指向的内存(int
数组)将保留在内存中,除非您在失去访问权限之前使用delete
t
。
在第二个示例中,数组本身存储在堆栈中,并且在t
超出范围时将被销毁(此处不使用delete
)。
答案 1 :(得分:4)
从技术上讲,C ++没有堆栈或堆的概念,因为它们是实现概念。因此,任何行动都可以自由地发挥作用。也就是说,通常通过new
获取的内存来自堆,而非静态局部变量(称为auto
存储类变量)位于堆栈中。
答案 2 :(得分:2)
new运算符动态分配内存并调用对象的相应构造函数(如果适用)(不适用于原始数据类型,如int,char等),malloc只是动态分配内存,动态分配总是来自堆 静态分配在堆栈上 所以,
int* t = new int[10]; //heap
再次
int t[10];// stack
答案 3 :(得分:0)
函数内部的所有变量(main也是函数)都存储在具有功能框架的堆栈中。当你输入一个函数时,按照以下顺序在堆栈上创建新框架
所以,当你写
int var_int[5];
int* var_intptr = new int[10];
为var_int保留5x4字节(或更多,无论机器是什么)。
4个字节(在机器上变化)保留用于指向int的var_intptr指针。
所以指针(包含目标地址的变量)放在堆栈,但是使用operator new生成的唯一对象位于堆上强>
退出函数时,局部变量和参数会从堆栈中弹出,对实例化对象的引用可能会丢失,但对象不会被删除。