2013-02-13 38 views
1

我只是用STL開始,說我有一個兔類,現在我創造一個兔子軍團...將堆棧中最初的對象推到一個向量中,對象是否會丟失?

#include <vector> 

vector<rabbit> rabbitArmy (numOfRabbits,rabbit()); 
//Q1: these rabbits are on the heap right? 

rabbit* rabbitOnHeap = new rabbit(); 
//Q2: rabbitOnHeap is on the heap right? 

rabbit rabbitOnStack; 
//Q3: this rabbit is on the stack right? 

rabbitArmy.push_back(rabbitOnStack); 
//Q4: rabbitOnStack will remain stored on the stack? 
//And it will be deleted automatically, though it's put in the rabbitArmy now? 

Q4是一個我最關心的是,我應該總是使用新的關鍵字添加兔子到我的軍隊?

Q5:有沒有更好的方式來兔子添加到軍隊比:

rabbitArmy.push_back(*rabbitOnHeap); 

回答

2
  1. 因爲我們還沒有另外規定,你把矢量對象將與std::allocator<rabbit>分配,它使用new。對於它的價值,這通常是稱爲「免費店」,而不是堆。
  2. 同樣,通常的術語是免費商店。
  3. 官方說,這是「自動存儲」,但是,對於典型的實現將會是堆棧,並且對於不支持硬件堆棧的實現,它仍然是堆棧式的(LIFO )某種數據結構。
  4. 將項目添加到矢量(或其他標準容器)時,實際添加到容器的內容是作爲參數傳遞的項目的副本。您作爲參數傳遞的項目仍然適合您的需求。在有自動存儲類的情況下,它會在超出範圍時被銷燬 - 但是它在集合中的副本將保持有效,直到它被刪除或集合被銷燬,等等。
  5. No. In事實上,你應該很少使用new來分配你要放入標準集合的物品。由於數組中的項目將成爲您傳遞內容的副本,因此通常不需要使用new來分配它。
  6. 通常你只需推回一個本地對象。

例如:

for (i=0; i<10; i++) 
    rabbitArmy.push_back(rabbit()); 

這產生10個臨時rabbit對象(rabbit()一部分),將每個的副本到rabbitArmy。然後,每個臨時對象都被銷燬,但是它們在rabbitArmy中的副本仍然存在。


  1. 在典型的使用情況, 「堆」 指的是由存儲器callocmallocrealloc,和free管理。 newdelete管理的是免費商店。一個新的表達式反過來從operator new(全局或類內)獲得內存。 operator newoperator delete被指定,所以他們的可能幾乎是直接傳遞到mallocfree分別,但即使這樣的情況下,堆和免費商店通常被認爲是分開的。
+0

超詳細!!!萬分感謝! – Arch1tect 2013-02-13 05:20:58

相關問題