繁体   English   中英

堆分配的对象会在堆栈上分配其成员吗?

[英]Will heap allocated objects have their members allocated on the stack?

让我们考虑这个例子。

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的实例,则销毁DynamiclyManagedObject时将销毁StaticlyManagedObject成员。

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

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的类成员。

在C ++中使用new运算符或在C中使用malloc进行动态分配时,无论类型(结构,类还是基元)如何(将结构的大小作为参数,以了解要分配多少字节),所有所需的空间(包含成员) 的一半将放置在堆上

这些调用返回指向已分配的堆存储区的指针。

局部函数变量和参数始终放在堆栈中

如果声明指针局部变量,它的位置仍将在堆栈上,但是您将必须使用上述动态分配方法来分配堆内存,堆栈分配的指针实际上将指向该堆内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM