堆分配的对象是否会在堆栈上分配其成员? 让我们考虑这个例子。 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++中的动态内存管理时,事情就被分配到堆栈中,不需要内存管理。

堆分配的对象是否会在堆栈上分配其成员? 让我们考虑这个例子。 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++中的动态内存管理时,事情就被分配到堆栈中,不需要内存管理。,c++,C++,然而,在这个例子中。我们有一个动态分配的对象,称为DynamiclyManagedObject,我在Foo构造函数中实例化了这个对象。我的问题是DynamiclyManagedObject的静态管理数据成员会发生什么情况 它仍然是在堆栈上创建的还是。。由于DynamiclyManagedObject是在堆中创建的,因此它的每个数据成员最终都会进入堆。子对象的存储持续时间与其所属的完整对象相同。如果动态分配了DynamiclyManagedObject的实例,则StaticlyManagedObj

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


它仍然是在堆栈上创建的还是。。由于DynamiclyManagedObject是在堆中创建的,因此它的每个数据成员最终都会进入堆。

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


非正式地说,您可能会说,当且仅当完整对象位于堆上时,子对象才会位于堆上。然而,从技术上讲,存储时间是正确的;堆和堆栈是实现细节。

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


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

无论您的类的成员是另一个类,或基本数据类型:

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;
};
类成员是另一个类还是基本数据类型(如
int
)都无关紧要。“_staticlyManagedObject”和“some_integer”彼此完全相同,只是它们的类型不同(当然,这并不是一个简单的属性)。一个是
int
,另一个是其他类。类成员的类型不影响其作用域。要么整个类是动态分配的,要么不是。或者它被分配到自动作用域中(如您所说,在堆栈上)

该规则的唯一例外是
静态
类成员:

class DynamiclyManagedObject
{
   StaticlyManagedObject _staticlyManagedObject;
   int some_integer;

   static std::string some_string;
};
某些字符串的规则不同。注意,这是一个真正的静态类成员,而不是类成员,它的类型恰好是“代码>静态管理对象 .< /P> < P>,无论类型是(结构、类或原始),在使用C++中的<强> new运算符< /强>或C中的动态分配时,请使用<强> MalOC>< /S>(获取结构的大小作为参数,以了解要分配的字节数)-所需的所有空间(包含成员)都将放置在堆上

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

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


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

非常感谢您的解释。我在下面得到的所有答案都非常好。另外感谢提到存储持续时间。快速搜索显示了这么多答案。现在我可以查看更多信息。感谢您澄清“StaticlyManagedObject”是动态分配的。