2012-10-16 58 views
0

除去元件的我基本上具有壽命從全局矢量

vector<Object> vec_; 

如在CPP類的類成員。在某一類功能這一載體將充滿了「對象」就像這樣:

vec_.push_back(Object()); 

在以後的時間我通過向量元素進行迭代,並保持一個指針的最佳元素。然後清除矢量,如下所示:

Object* o_ptr = &(vec_[0]); 
for (unsigned int i = 1; i < vec_.size(); i++) { 
    if (o_ptr->getCost() > vec_[i].getCost()) { 
    o_ptr = &(vec_[i]); 
} 

vec_.clear(); 

現在我的問題是:從矢量中移除的對象會發生什麼?只要將它們從矢量中移除,它們的一生就會過去?那麼指針是否也指向空白空間呢? 如果不是這些對象的生命週期何時結束?

問候SCR

回答

1

會發生什麼事,從載體刪除的對象?

它們被破壞。

只要它們從載體除去他們的一生結束了嗎?

是的。

指針是否也指向空白空間呢?

是的。如果要保存該對象,請在清除矢量前複製該對象。

重要的是要注意,即使矢量未被清除,某些矢量操作可能會使指針指向空白。具體調整大小,通常涉及重新分配。通常索引存儲對向量元素的引用通常是最好的,因爲您將始終能夠通過索引獲取元素(而某些操作後指針可能會失效)。

應用於向量的下標運算符返回一個引用並且不復制。

3

vector.clear()被調用(或當vector被破壞)含有與vector所有對象將被破壞(如在這種情況下它們是對象,而不是原始指針),留下o_ptr作爲懸空指針。

請注意,即使沒有調用clear(),緩存vector中元素的地址(或迭代器)也是危險的。例如,push_back()可能會導致vector的內部重新分配,使緩存的地址(或迭代器)無效。

1

跟蹤對象生命週期的最佳方式是向構造函數和析構函數添加printf。

class MyObject 
{ 
public: 
    MyObject() 
    { 
     printf("MyObject constructed, this=%p\n", this); 
    } 
    ~MyObject() 
    { 
     printf("MyObject destructed, this=%p\n", this); 
    } 
}; 
+0

你在多方面得到了這個錯誤:你的類不可構造(private constructor/destructor)。你錯過了一個拷貝構造函數(規則三不服從,因爲它應該是這個任務)。通過這種設置,除私人建築外,您將很容易看到比建築更多的破壞。 –

1

對象歸屬矢量,.clear()確實將其刪除。

另外,指向存儲在std::vector中的對象的有點危險。如果將新元素添加到矢量中,某些時候矢量可能需要分配更多內存 - 這可能會使用其複製構造函數將所有以前的元素複製到不同的地址(從而使指針無效)。

因此:使用整數索引std::vector而不是指針,除非您知道您不會超出保留容量(您可以使用.reserve()保證)。 (同樣,當我們在它的時候,不要混淆向量的內部緩衝區大小與.size(),這只是存儲的實際元素的數量)。