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

时间:2016-08-19 22:29:14

标签: c++

让我们考虑这个例子。

Future[None]

有人告诉我,当我们不在C ++中使用动态内存管理时,事情会被堆叠分配,我们不需要内存管理。

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

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;
};

类成员是另一个类,还是基本数据类型,例如int,这无关紧要。两个" _staticlyManagedObject"和#34; some_integer"彼此完全相同,除了它们的类型(当然,这不是一个微不足道的属性)。一个是int,另一个是其他类。类成员的类型不会影响其范围。整个类是动态分配的,还是不是。或者它在自动范围内分配(在堆栈中,如你所说)。

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

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;

   static std::string some_string;
};

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

答案 3 :(得分:0)

无论类型(无论是结构,类还是原语),在C ++中使用 new运算符或在C中使用 malloc 进行动态分配(获取你的struct作为参数的大小,知道要分配多少字节) - 所有需要的空间(包含成员)将放在堆上。

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

本地函数变量和参数总是放在堆栈上

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