我已经在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对象(复合模式)。
答案 0 :(得分:2)
取决于如何创建存储CCompositePrimitive m_DrawOjects;
的类。 (我认为它存储在一个类中,因为m_
)
如果您的类是在堆栈上创建的,那么m_DrawObjects
也是如此。如果您的类是在堆上创建的,那么m_DrawObjects
也是如此。
但是在堆或堆栈上创建了无关的m_DrawObjects
,list<CDrawObject*> m_Objects;
内的对象将在堆上创建,因为这就是链表的工作方式。
修改:根据您的编辑和评论,当然会在堆栈上创建DrawObjects
。 :)但是我所说的列表中的对象仍然适用。
答案 1 :(得分:1)
您放入任何STL集合的项目是动态分配的。您的主要问题是管理集合中指针的生命周期。
vector会将指针存储在连续的存储中,因此每个项目的开销会减少,因为它不需要指向下一个和前一个节点的指针。
当您在集合末尾插入或删除时,列表会更有效,并且当您超出容量时,将永远不会有重新分配的开销。
deque是最好的集合,如果你从不想要重新分配的开销,拥有大量不需要连续存储的对象,并且只是从末端插入和删除:任何一端 - 但绝不会在中间。
如果要管理指针本身的生命周期,可以使用shared_ptr作为集合类型。这也有一个开销。 boost提供了类型安全的指针集合,用于管理其中项目的内存。