堆分配的对象是否将其成员分配到堆栈上?

我们来考虑一下这个例子。

class StaticlyManagedObject
{
   //some class members....
}
class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject; //is this still allocated at the stack?

}

class Foo
{
  DynamiclyManagedObject * _dynamiclyManagedObject; //will be allocated in the heap.
  Foo()
  {
      _dynamiclyManagedObject = new DynamiclyManagedObject();
  }
}

我被告知,当我们不使用C ++中的动态内存管理时,事物被分配在堆栈中,我们不需要内存管理。

但是,在这个例子中。 我们有一个名为DynamiclyManagedObject的动态分配对象,我在Foo构造函数中实例化这个对象。 我的问题是DynamiclyManagedObject的静态管理数据成员会发生什么?

它是否仍然在堆栈上创建或..因为DynamiclyManagedObject在堆中创建的事实,它的每个数据成员都会堆到堆中。


子对象与它所属的完整对象具有相同的存储持续时间。 如果DynamiclyManagedObject的实例是动态分配的,那么当StaticlyManagedObject被销毁时, DynamiclyManagedObject成员将被销毁。

非正式地,当且仅当整个对象位于堆上时,您可能会说子对象将在堆上。 但是,存储时间是谈论它的技术上正确的方式; 堆和堆栈是实现细节。


StaticlyManagedObject是一个用词不当。 它是动态分配的,与父对象相同。

嵌套类成员使用与父对象相同的分配方法,除非它们具体标记为static ,在这种情况下,它们不在创建对象时分配,或者在构造函数中动态分配。


无论您的班级成员是另一班还是基本数据类型:

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;
};

无论类成员是另一个类还是基本数据类型(如int都无关紧要。 “_staticlyManagedObject”和“some_integer”都是完全相同的,除了它们的类型(当然,这不完全是一个微不足道的属性)。 一个是int ,另一个是其他类。 类成员的类型不影响其范围。 整个类都是动态分配的,否则不是。 或者它在自动作用域中分配(在堆栈中,如你所说)。

规则的唯一例外是static类成员:

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;

   static std::string some_string;
};

some_string的规则不同。 请注意,这是一个真正的静态类成员,而不是类型恰好为StaticallyManagedObject的类成员。

链接地址: http://www.djcxy.com/p/79945.html

上一篇: Will heap allocated objects have their members allocated on the stack?

下一篇: c# structs/classes stack/heap control?