当在本地函数的上下文中时,堆栈和堆之间的差异已被充分记录,但我对实例变量很好奇。
由于实例变量需要一直存在直到它被释放,它是否存储在相同类型的内存中,无论它是否是用new
创建的?
即
Class A{
SomeType s1;
SomeType * s2;
}
如果这些是自动局部变量,则这两种机制之间的差异是相当大的。但是作为实例变量,它们或多或少在内存中的同一位置,都在堆上?
答案 0 :(得分:4)
A::s1
和A::s2
将以创建A
实例的任何方式和位置存储。至于A::s2
指向的存储位置,它可以在任何地方。
答案 1 :(得分:2)
非指针变量在存储区域中定义,具体取决于声明 或 。
Myclass obj;
功能范围的将在自动存储上创建,而如果在全局范围创建,将使用静态存储持续时间创建。
在您的示例中,A::s1
和A::s2
都将具有与其所属对象相同的存储区域。但是,由于A::s2
是一个指针,它可能指向一个可能放在不同存储区域的对象。
例如:
void doSomething()
{
A obj;
SomeType obj2;
obj.s2 = &obj2;
}
A::s2
指向存储与obj
相同的对象,而:
void doSomething()
{
A obj;
SomeType *ptr = new SomeType;
obj.s2 = ptr;
}
A::s2
指向动态分配的对象。
注意:为简单起见,上面的代码假定A::s2
为public
。