本地类变量位置

时间:2014-11-15 18:07:05

标签: c++ oop memory-management

如果类在堆栈上实例化它的所有局部变量(例如:堆栈上的int i; //An integerint *p; //Pointer to an int),而类本身在堆上实例化,会发生什么?班级成员在哪里? 这是一个例子:

class A  {
  public:
  int a, b; //These are instantiated on the stack, if the line were written outside a class definition.
  A(int _a, int _b)  { 
    a = _a;
    b = _b;
  }
};

现在,如果我们像这样实例化A:

#include <iostream>
A* classA = new A(1,2);
int main(void)  {
  std::cout << classA.a << "\t" << classA.b << endl;
  return 0;
}

classA.aclassA.b在哪里?他们在程序堆栈上吗?是否自动放在堆上,因为classA是?

在大多数情况下不是问题,我不会想,但知道这可能会有所帮助......

3 个答案:

答案 0 :(得分:4)

  

int a, b; //These are instantiated on the stack,

不,这些都没有在堆栈上实例化。成员变量是实例数据结构的一部分,因此被分配在与类实例相同的内存块中。只有当类实例在堆栈上时,实例字段才会存在。

答案 1 :(得分:1)

此行事实上不正确

  int a, b; //These are instantiated on the stack, normally

这取决于对象的创建方式 - 使用new或在堆栈上

答案 2 :(得分:0)

类是数据结构的定义;一块记忆。它没有定义该内存块的来源。但是,单个对象的所有内存都来自同一个地方。

 static Class A ;

在堆栈程序部分中为A分配所有数据。

. . . . . 
{
    Class A ;
}

在堆栈上分配A的所有数据(或者使用的任何机制 - 堆栈)。

Class *A = new A ;

在动态内存中为A分配所有数据。