【问题标题】:Will heap allocated objects have their members allocated on the stack?堆分配的对象会在堆栈上分配其成员吗?
【发布时间】:2018-09-09 16:07:45
【问题描述】:

让我们考虑这个例子。

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是在堆中创建的,它的每个数据成员最终都进入了堆中。

【问题讨论】:

    标签: c++


    【解决方案1】:

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

    非正式地说,当且仅当完整的对象在堆上时,子对象才会在堆上。但是,存储持续时间是技术上正确的谈论方式;堆和栈是实现细节。

    【讨论】:

    • 非常感谢您的精彩解释。我在下面得到的所有答案都同样出色。额外感谢您提及存储期限。快速搜索显示了很多答案。现在我可以进一步了解它了。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您澄清“StaticlyManagedObject”是动态分配的。
    【解决方案3】:

    你的类的成员是另一个类还是基本数据类型:

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

    【讨论】:

      【解决方案4】:

      无论是什么类型(结构、类或基元),当在 C++ 中使用 new 运算符 或在 C 中使用 ma​​lloc 进行动态分配时(获得结构的大小作为参数,以了解要分配多少字节) - 所有所需的空间(包含成员)将被放置在堆上

      这些调用返回一个指向已分配堆内存区域的指针。

      局部函数变量和参数总是放在栈中

      如果你声明一个指针局部变量,它的位置仍然在堆栈上,但你必须使用上面提到的动态分配方法来分配堆栈分配的指针实际指向的堆内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-18
        • 2013-01-25
        • 1970-01-01
        • 2020-08-24
        • 2012-06-05
        • 1970-01-01
        • 2017-02-21
        相关资源
        最近更新 更多