在本地函数的上下文中,堆栈和堆之间的区别有据可查,但我对实例变量很好奇。
由于实例变量需要一直存在直到它被释放,它是否存储在相同类型的内存中,无论它是否创建new
?
IE
Class A{
SomeType s1;
SomeType * s2;
}
如果这些是自动局部变量,那么这两种机制之间的差异是相当大的。但是作为实例变量,它们或多或少在内存中的相同位置,都在堆上?
A::s1
并且A::s2
根据定义,将以A
创建实例的任何方式和位置存储。至于 指向的存储位置A::s2
,可以是任何地方。
非指针变量在存储区域中定义取决于它们的声明方式或位置。
Myclass obj;
at 函数范围将在自动存储上创建,而如果在全局范围创建,则将使用静态存储持续时间创建。
在您的示例中,两者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
为了简单起见。