2010-05-14 94 views
3

當調用vector的push_back方法時,向量中的上一個對象正在被破壞,原因可能是什麼。在添加新對象時銷燬向量中的對象

template<typename type> void SomeList<type>::AddElement(type &inObject) 
{ 
    pList.push_back(inObject);// pList is member of my class Vector SomeList 
} 
+3

一些代碼,請。矢量通常不會這樣做,所以在任何人都可以幫助您之前需要一些背景。 – 2010-05-14 13:32:08

+0

@Marcelos編輯了代碼爲 – boom 2010-05-14 13:37:46

+0

的查詢。將來,突出顯示您的代碼並單擊'101010'按鈕進行正確格式化。 – 2010-05-14 13:38:43

回答

0

該向量不會破壞該對象。它取代它。

例如:

vector< A> myVector; // Do some initialization, etc. 
A myNewObject; 
myVector[0] = myNewObject; // Replace the object. 

這意味着賦值運算符(A & A::operator=(const A&))將被稱爲用於myVector[0]。那裏沒有破壞。

當矢量本身被破壞,或者當內存被重新分配時(在這種情況下,複製構造函數也被用於將對象從舊位置複製到新位置,然後銷燬舊的那些)。

後來編輯 在的push_back情況下,破壞必須由一個重分配來確定。

+0

@Catalin:好的,然後在我的代碼中,當我調用AddElement方法時,同時調用push_back它在內部調用destroy方法。 – boom 2010-05-14 13:44:35

+0

確切地說,但不是針對每個push_back調用,只有在應該進行重新分配時。 – 2010-05-15 18:26:20

+0

好的,你說的是對的,但這是否意味着向量中的對象被銷燬。 – boom 2010-05-17 05:13:53

1

如果您發佈了一些代碼,我們將有更好的機會幫助您。僅供參考,vector::push_back可能會導致內部陣列重新分配,因此可能會增長。這是你的意思嗎?

4

它可能不是該對象本身被「摧毀」,而是在重新分配期間增加矢量大小時,該對象被複制,舊對象被清除。因此,在創造和銷燬控制程序流程中加入某些東西並不是一個好主意。爲此,我會建議另一個容器對象或smart_ptr

0

當載體的push_back方法是所謂的矢量以前的對象是越來越銷燬。這可能是什麼原因。

原因是std::vector因此被指定。

當您不斷向元素添加元素時,某個點的內存容量已用完。然後它會分配一個新的內存儲備,將所有舊對象複製到那裏(加上發生時添加的對象),並銷燬舊對象。
std::vector試圖通過「過度分配」來最小化這種情況,它分配的內存超過預期進一步增長所需的內存。 (查找capacity()size()reserve()resize()以瞭解更多關於此的信息。)但是每個儲備可能在某個時間點被超過,然後它必須重新分配和複製。

如果你不想要這個,看看std::dequestd::list