当我们在函数中实例化c ++中的int x
变量时(即x是局部变量),它被分配在进程的堆栈之上。但是如果我们执行int *x= new int
,则会在堆中提供空间。
所以,我的问题是:
不同类的对象(由c ++或用户定义提供的类)怎么样?他们的对象在哪里被实例化?例如:让Employee是一个类,我们声明Employee emp;
。给定空间的emp
在哪里 - >在堆栈上还是在堆中?
如果声明int a[4]
在函数内,那么a
的所有四个单元格都会在堆栈上获得空间吗?
答案 0 :(得分:8)
所有局部变量,无论是来自类的内置类型,还是它们都是数组,都在堆栈中。所有动态分配都在堆上。
当然,局部变量上的static
等修饰符会使变量放在其他位置,因此它会在函数调用之间保留。
另外,为了进一步混淆,在创建本地指针变量时,使其指向动态分配的对象,例如:
Class* a = new Class;
实际变量a
在堆栈上,但它指向的内存在堆上。
附录:C ++规范实际上并未提及有关堆栈或堆的任何内容,只提及不同类型变量的行为。
答案 1 :(得分:7)
它与普通类型完全相同。
Class a; //stack. Usage: a.somethingInsideOfTheObject
Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject
请注意,如果类本身在堆上分配某些内容,那么该部分将始终位于堆上,例如:
class MyClass
{
public:
MyClass()
{
a = new int();
}
private:
int * a;
};
void foo()
{
MyClass bar;
}
在这种情况下,bar
变量将在堆栈上分配,但其中的a
将在堆上分配。
答案 2 :(得分:3)
这取决于。如果Employee
有成员,只在堆栈上分配,那么整个对象就是。但是,Employee
可能有指针成员,而Employee
的构造函数可能会在堆上为它们分配内存。然后一些成员在堆上,一些在堆栈上。
是
答案 3 :(得分:2)
用户定义的类(和类型)与内置类型没有什么不同。 所以
Employee emp; // allocated in stack
Employee* emp = new Employee(); // allocated in heap
至于你的第二个问题,本地数组是在堆栈上分配的
Employee emp[4]; // 4 instances on stack
答案 4 :(得分:1)
通常,如果编译器在编译时知道它(即局部变量),它就在堆栈上
如果编译器在编译时不知道它(即通过new
,malloc
等进行动态分配),它就在堆上。