非指针实例变量是否存储在堆上?

时间:2013-04-12 11:54:29

标签: c++ variables memory

当在本地函数的上下文中时,堆栈和堆之间的差异已被充分记录,但我对实例变量很好奇。

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

Class A{
  SomeType s1;
  SomeType * s2;
 }

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

2 个答案:

答案 0 :(得分:4)

根据定义,

A::s1A::s2将以创建A实例的任何方式和位置存储。至于A::s2指向的存储位置,它可以在任何地方。

答案 1 :(得分:2)

非指针变量在存储区域中定义,具体取决于声明

Myclass obj;
功能范围的

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

在您的示例中,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