对象的内存分配

时间:2013-02-06 08:15:47

标签: c++ variables stack heap

当我们在函数中实例化c ++中的int x变量时(即x是局部变量),它被分配在进程的堆栈之上。但是如果我们执行int *x= new int,则会在堆中提供空间。

所以,我的问题是:

  1. 不同类的对象(由c ++或用户定义提供的类)怎么样?他们的对象在哪里被实例化?例如:让Employee是一个类,我们声明Employee emp;。给定空间的emp在哪里 - >在堆栈上还是在堆中?

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

5 个答案:

答案 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)

  1. 这取决于。如果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)

通常,如果编译器在编译时知道它(即局部变量),它就在堆栈上 如果编译器在编译时不知道它(即通过newmalloc等进行动态分配),它就在堆上。

这篇文章有详细解释:global-memory-management-in-c-in-stack-or-heap