将对象存储在内存中的正确决定(复合模式)

时间:2011-02-09 09:11:54

标签: c++ design-patterns memory-management

我已经在Main.cpp

中使用了CCompositePrimitive类
int main()
{
    ...
    CCompositePrimitive DrawObjects;
    ...
}

CCompositePrimitive类有字段:

private:
 list<CDrawObject*> m_Objects;

和方法:

public:
 Add(...);


void CCompositePrimitive::Add() {
 Objects.push_back(new Rectangle(...))
}

在某些论坛上问我DrawObjects对象将存储在堆中。但我想其他的。在我看来,DrawObjects对象将存储在堆栈中。 如果DrawObjects可以存储在列表m_Objects中,如何保存计算机的堆栈溢出内存(任何不同的内存问题);非常多的对象,它们也可以包含CCompositePrimitive对象(复合模式)。

2 个答案:

答案 0 :(得分:2)

取决于如何创建存储CCompositePrimitive m_DrawOjects;的类。 (我认为它存储在一个类中,因为m_
如果您的类是在堆栈上创建的,那么m_DrawObjects也是如此。如果您的类是在堆上创建的,那么m_DrawObjects也是如此。 但是在堆或堆栈上创建了无关的m_DrawObjectslist<CDrawObject*> m_Objects;内的对象将在堆上创建,因为这就是链表的工作方式。

修改:根据您的编辑和评论,当然会在堆栈上创建DrawObjects。 :)但是我所说的列表中的对象仍然适用。

答案 1 :(得分:1)

您放入任何STL集合的项目是动态分配的。您的主要问题是管理集合中指针的生命周期。

vector会将指针存储在连续的存储中,因此每个项目的开销会减少,因为它不需要指向下一个和前一个节点的指针。

当您在集合末尾插入或删除时,

列表会更有效,并且当您超出容量时,将永远不会有重新分配的开销。

deque是最好的集合,如果你从不想要重新分配的开销,拥有大量不需要连续存储的对象,并且只是从末端插入和删除:任何一端 - 但绝不会在中间。

如果要管理指针本身的生命周期,可以使用shared_ptr作为集合类型。这也有一个开销。 boost提供了类型安全的指针集合,用于管理其中项目的内存。