[英]Will data members on a heap-allocated object be allocated on the heap or the stack?
[英]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.