7

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

所以,我的问题是:

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

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

4

5 回答 5

11

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

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

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

Class* a = new Class;

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


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

于 2013-02-06T08:19:30.670 回答
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它的内部将在堆上分配。

于 2013-02-06T08:18:14.153 回答
4
  1. 这取决于。如果Employee有成员,仅在堆栈上分配,那么整个对象就是。但是,Employee可能有指针成员,并且Employee的构造函数可以在堆上为它们分配内存。然后一些成员在堆上,一些在堆栈上。

  2. 是的。

于 2013-02-06T08:19:38.880 回答
3

用户定义的类(和类型)与内置类型没有什么不同。所以

Employee emp; // allocated in stack
Employee* emp = new Employee(); // allocated in heap

至于你的第二个问题,本地数组是在堆栈上分配的

Employee emp[4]; // 4 instances on stack
于 2013-02-06T08:21:14.373 回答
1

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

这个帖子有详细解释:global-memory-management-in-c-in-stack-or-heap

于 2013-02-06T08:23:48.497 回答