如果类在堆栈上实例化它的所有局部变量(例如:堆栈上的int i; //An integer
与int *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.a
和classA.b
在哪里?他们在程序堆栈上吗?是否自动放在堆上,因为classA
是?
在大多数情况下不是问题,我不会想,但知道这可能会有所帮助......
答案 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分配所有数据。