所有局部变量,无论是来自类的内置类型,还是它们是数组,都在堆栈中.所有动态分配都在堆上.
当然,像static局部变量这样的修饰符会使变量放在其他地方,所以它在函数调用之间保留.
此外,为了进一步混淆,当您创建本地指针变量,并使其指向动态分配的对象时,例如
Class* a = new Class;
Run Code Online (Sandbox Code Playgroud)
实际变量a在堆栈上,但它指向的内存在堆上.
附录:C++规范实际上并未提及有关堆栈或堆的任何内容,只提及不同类型变量的行为.
它与普通类型完全相同.
Class a; //stack. Usage: a.somethingInsideOfTheObject
Class *a = new Class(); //heap. Usage: a->somethingInsideOfTheObject
Run Code Online (Sandbox Code Playgroud)
请注意,如果类本身在堆上分配某些内容,则该部分将始终位于堆上,例如:
class MyClass
{
public:
MyClass()
{
a = new int();
}
private:
int * a;
};
void foo()
{
MyClass bar;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,bar变量将在堆栈上分配,但其a内部将在堆上分配.
这取决于。如果Employee有仅在堆栈上分配的成员,则整个对象都是。但是,Employee可能有指针成员,并且Employee的构造函数可能会在堆上为它们分配内存。那么有些成员在堆上,有些在栈上。
是的。