2016-08-19 88 views
1

我们来考虑一下这个例子。堆分配的对象是否将其成员分配到堆栈上?

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在堆中创建,它的每个数据成员都会堆到堆中。

回答

4

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

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

+0

非常感谢您的好解释。我得到的所有答案同样很棒。另外感谢提及存储时间。快速搜索显示了如此多的答案。现在我可以更多地了解它。 – Nusakan

3

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

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

+0

感谢您澄清“StaticlyManagedObject”是动态分配的。 – Nusakan

2

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

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

0

不考虑类型的(可能是一个结构,类或原语),在C++或下用的malloc(它可以获取您的结构作为参数的大小动态分配使用新操作者时,要知道要分配多少字节) - 所有需要的空间(包含成员)将被放置在堆上。

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

本地功能变量和参数始终放置在堆栈上。

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