2

在本地函数的上下文中,堆栈和堆之间的区别有据可查,但我对实例变量很好奇。

由于实例变量需要一直存在直到它被释放,它是否存储在相同类型的内存中,无论它是否创建new

IE

Class A{
  SomeType s1;
  SomeType * s2;
 }

如果这些是自动局部变量,那么这两种机制之间的差异是相当大的。但是作为实例变量,它们或多或少在内存中的相同位置,都在堆上?

4

2 回答 2

4

A::s1并且A::s2根据定义,将以A创建实例的任何方式和位置存储。至于 指向的存储位置A::s2,可以是任何地方。

于 2013-04-12T11:58:06.007 回答
2

非指针变量在存储区域中定义取决于它们的声明方式位置。

Myclass obj;

at 函数范围将在自动存储上创建,而如果在全局范围创建,则将使用静态存储持续时间创建。

在您的示例中,两者A::s1A::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::s2public为了简单起见。

于 2013-04-12T11:55:51.527 回答