对象的内存分配

Avi*_*mar 5 c++ variables heap stack

当我们像int x在函数中一样在c ++中实例化变量(即x是局部变量)时,它被分配在进程的堆栈之上.但是如果我们这样做int *x= new int,空间就在堆中提供.

所以,我的问题是:

  1. 那些不同类的对象(由c ++或用户定义提供的类)怎么样?他们的对象在哪里被实例化?例如:Let Employee是一个类,我们声明Employee emp;.在emp堆栈或堆中给出space->的位置?

  2. 如果声明int a[4]在一个函数中,那么a在堆栈上获取所有四个获取空间的单元格吗?

Som*_*ude 8

所有局部变量,无论是来自类的内置类型,还是它们是数组,都在堆栈中.所有动态分配都在堆上.

当然,像static局部变量这样的修饰符会使变量放在其他地方,所以它在函数调用之间保留.

此外,为了进一步混淆,当您创建本地指针变量,并使其指向动态分配的对象时,例如

Class* a = new Class;
Run Code Online (Sandbox Code Playgroud)

实际变量a在堆栈上,但它指向的内存在堆上.


附录:C++规范实际上并未提及有关堆栈或堆的任何内容,只提及不同类型变量的行为.


Sin*_*all 7

它与普通类型完全相同.

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内部将在堆上分配.


Kir*_*rov 4

  1. 这取决于。如果Employee有仅在堆栈上分配的成员,则整个对象都是。但是,Employee可能有指针成员,并且Employee的构造函数可能会在堆上为它们分配内存。那么有些成员在堆上,有些在栈上。

  2. 是的。