这些是在堆还是堆栈上创建的

时间:2013-11-24 23:27:11

标签: c++

说我有一个班级

class foo
{
  private:
  std::string str;
  int a;
  poo* p;

  public:
  foo
  {
     p = new poo();
  }

  void someMethod() {....}
}

现在我想知道我是否采用以下方式:

foo* f = new foo();

foo f;

在每种情况下,会在哪里创建变量strap?成员变量是否受类创建方式的影响?例如,我认为将在堆栈上创建stra,并在堆上创建p。如果有人能清除它,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

指向的poo实例p始终位于堆上,但指针本身(p)位于foo实例中。

在第一个版本(foo* f = new foo())中,在堆上创建foo实例(包括它的所有成员,它们总是在同一个地方)和指向它的指针({{ 1}} var)存储在堆栈或某些寄存器中(直到编译器)。

在第二个版本中,foo实例位于堆栈中(包括其所有成员)。

但请注意,对象的实际位置并不像对象的实际范围那么重要。你应该真正查找RAII这个词。

答案 1 :(得分:0)

创建类的非静态数据成员,在那里创建类的对象。