堆分配的对象是否将其成员分配到堆栈上?
我们来考虑一下这个例子。
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
的类成员。
上一篇: Will heap allocated objects have their members allocated on the stack?