哪一个:在C ++中使用NEW创建对象时使用Stack或Heap

时间:2014-05-06 13:50:31

标签: c++ stack heap

没有任何多余的理论。如果我写:

int* t = new int[10]; //stack or heap is beign used?

再次

int t[10];// stack or heap is beign used?

4 个答案:

答案 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也是函数)都存储在具有功能框架的堆栈中。当你输入一个函数时,按照以下顺序在堆栈上创建新框架

  • 首先,将函数参数推送到堆栈
  • 然后将返回地址推送到堆栈 (推送电脑)
  • 基指针(用于指向功能框的计算机寄存器)被推送到堆栈,因此外框的旧基(帧)指针被保存在堆栈中。 (推bp)
  • 基指针设置为指向堆栈指针所指向的位置 (mov bp,sp)
  • 然后保留局部变量的空间,并通过相对基址指针计算机访问它们

所以,当你写

int var_int[5];
int* var_intptr = new int[10];

为var_int保留5x4字节(或更多,无论机器是什么)。

4个字节(在机器上变化)保留用于指向int的var_intptr指针。

所以指针(包含目标地址的变量)放在堆栈但是使用operator new生成的唯一对象位于堆上

退出函数时,局部变量和参数会从堆栈中弹出,对实例化对象的引用可能会丢失,但对象不会被删除。