2012-07-28 161 views
1

通常,當我使用處於非本地範圍的STL對象時,我存儲指向要存儲的數據的指針。例如,C++ STL內存管理:堆棧還是堆?

std::vector<MyStruct*> 

當清理向量的時候,我會通過並刪除所有東西。我最近注意到,這並不像我想的那樣是必要的。無論出於什麼原因,我正在考慮STL類將數據存儲在堆棧上,而現在我認爲它將它分配到堆上。它是否正確?將對象存儲爲減少複製時間的指針是唯一真正的好處嗎?

+3

'std :: vector '可以存儲'Circle *'。 'std :: vector '可以不**存儲'Circle'。 – DCoder 2012-07-28 09:55:53

+0

每個動態容器中的每個對象始終無條件地爲* dynamic *對象,其生命週期由容器管理。內存分配策略的配置是什麼,但這並不重要。請記住,C++將內存分配和對象創建分離爲兩個不同的概念和責任域。 – 2012-07-28 11:25:51

回答

6

標準容器通過Allocator對象分配內存,該對象的類型作爲模板參數傳遞。如果你沒有通過其他任何東西,那將是std::allocator<T>,它將使用new分配內存。底線:您可以強制他們幾乎以任何方式分配內存,但默認情況下它會來自免費商店。

如果你真的想要一個指針容器,容器將擁有指針對象(例如,當對象被銷燬時會自動刪除它們),你可能想看看Boost Pointer Containers

2

當我要清理矢量的時候,我通過並刪除 的一切。我最近注意到這不是必要的,就像我認爲它是一樣。

不要以爲。如果在你的向量點指向動態分配的內存,那麼你WILL需要刪除記憶,矢量不會爲你做。

例如,如果您的代碼的類型是

MyStruct* pNewStruct = new MyStruct; 
myVector.push_back(pNewStruct); 

... 
... 

myVector.clear(); 

的你有內存泄漏你有沒有具體你刪除分配給要添加到向量中的每個元件的存儲器。該向量釋放它自己分配的內存作爲動態數組的一部分,但這只是釋放了指針數組,而不是它們指向的內存

3

使用指針來減少複製時間真正的好處。考慮一下可以改進的所有矢量操作 - 比如排序。

另一個真正的好處(如上面註釋中所述)是,這允許您使用多態並將相關的對象存儲在同一個向量中。一些你不能用標量對象(非指針)做的事情。

無論您存儲在堆棧或堆數據不會向它是多麼昂貴的移動對該對象的差異(嗯......確實如此,但往往是相當微不足道的,在這個討論不相關)。

當您在STL向量中存儲指向您的對象的指針時,向量不會取得對象的所有權。你仍然需要做盡職調查,並清除它們不再被需要的時候。

+0

謝謝,清除它:) – user1520427 2012-07-28 09:57:48

+0

+1多態性和dising可避免的批量複製:( – 2012-07-28 10:27:29

3

[...]而我現在認爲它分配在堆上。它是否正確?

是的。如果聲明的載體爲:

std::vector<MyStruct*> v; 

那麼你基本上存儲在矢量指針,所以載體將分配內存來存儲指針,而不是對象指向的指針。所以,當析構函數運行時,矢量會收回其已分配的內存,它不會解除分配指針一下決定的內存,即它不會解除分配內存存儲在矢量指針指向。

但是,如果此聲明:

std::vector<MyStruct> v; 

那麼你存儲對象本身,所以向量將分配的內存來存儲的對象,它會釋放它的析構函數運行時。