【问题标题】:memory allocation for objects对象的内存分配
【发布时间】:2013-01-21 08:59:57
【问题描述】:

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

所以,我的问题是:

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

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

【问题讨论】:

  • 我想提一下new,如果没有超载,它会在所谓的空闲存储中分配空间,这不一定是堆,尽管实际上它是。如果它重载,new 可以做任何事情。

标签: c++ variables heap-memory stack-memory


【解决方案1】:

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

当然,局部变量上的 static 等修饰符会将变量放在其他位置,因此它会在函数调用之间保留。

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

Class* a = new Class;

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


附录:C++ 规范实际上并未提及堆栈或堆,仅提及不同类型变量的行为。

【讨论】:

    【解决方案2】:

    这与普通类型完全相同。

    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 将分配在堆上。

    【讨论】:

    • 可能值得注意的是,如果Class 在内部使用new,则始终使用堆,即使a 本身存在于堆栈中。
    • @NPE,没错,但只要你把它们当成黑盒子,你几乎不会知道
    • @SingerOfTheFall - 没错,这仍然是一个重要的细节。
    • @meh,好的,我已将其添加到我的答案中
    • @SingerOfTheFall:我认为这个细节很重要的原因是,如果有人将std:vector<int> 放在堆栈上,他们不应该期望向量的内容进入堆栈。
    【解决方案3】:
    1. 视情况而定。如果Employee 具有仅在堆栈上分配的成员,则整个对象都是。但是,Employee 可能有指针成员,Employee 的构造函数可能会在堆上为它们分配内存。然后一些成员在堆上,一些在栈上。

    2. 是的。

    【讨论】:

      【解决方案4】:

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

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

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

      Employee emp[4]; // 4 instances on stack
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-10-15
          • 2014-03-17
          • 1970-01-01
          • 2013-12-04
          • 1970-01-01
          • 1970-01-01
          • 2019-11-27
          • 2020-06-02
          相关资源
          最近更新 更多