2011-02-09 83 views
0

存儲對象的正確的決定我已經CCompositePrimitive類的對象在Main.cpp的在存儲器(複合模式)

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

你可能會節省很多處理時間和內存通過使用std :: vector而不是列表 – Grozz 2011-02-09 09:42:37

+0

爲什麼如果我將使用std :: vector而不是列表我節省內存管理? – 2011-02-09 09:47:44

+1

取決於他是否想要插入並從中間移除物品或將它們洗牌。 – CashCow 2011-02-09 09:48:01

回答

2

取決於存儲類CCompositePrimitive m_DrawOjects;的類是如何創建的。 (由於m_,我假設它存儲在一個班級裏)
如果你的班級是在堆棧上創建的,那麼m_DrawObjects也是。如果您的課程是在堆上創建的,那麼將會是m_DrawObjects。 但是,在堆或堆棧上創建了無關的m_DrawObjects,因此list<CDrawObject*> m_Objects;內的對象將在堆上創建,因爲這就是鏈表的工作原理。

編輯:根據您的編輯和評論,DrawObjects當然是在堆棧上創建的。 :)但是我所說的關於列表中的對象仍然成立。

1

您放入任何STL集合的項目都是動態分配的。您的主要問題是管理集合中指針的生存期。

向量會將指針存儲在連續存儲中,因此每個項目的開銷較少,因爲它不需要指向下一個節點和前一個節點的指針。

當您插入或移除除集合末尾以外的其他列表時,其效率會更高,並且當您超出容量範圍時,永遠不會有重新分配的開銷。

deque是最好的集合使用,如果你永遠不想重新分配的開銷,有大量的對象不需要連續存儲,並且只能插入和從末端刪除:無論是結束 - 但從來沒有在中間。

如果你想管理指針本身的生命週期,你可以使用shared_ptr作爲你的集合類型。這也是一個開銷。 boost提供了管理其中項目內存的類型安全指針集合。