2011-12-28 117 views
15
/* bar.h */ 
class bar{ 
    /* standard stuff omitted */ 
    std::vector<my_obj*> foo; 
}; 

/* bar.cpp */ 
bar::bar(){ 
    // foo = new std::vector<my_obj*>(); <-- why don't I need this line?? 
    foo.push_back(new my_obj()); 
} 

爲什麼這個工作沒有先分配foo std :: vector的新實例?爲什麼不需要使用「新」來初始化std :: vector?

+0

他們說的。另外,我不推薦'foo.push_back(new my_obj());'因爲你要在那裏釋放內存? – 2011-12-28 19:05:28

回答

33

因爲C++不是C#/ Java。

std::vector<my_obj*> foo; 

這是一個對象,不參考的定義如在C#/ Java的。一個對象是一個活的實例。

new std::vector<my_obj*>() 

此表達式返回一個指針。它返回一個std::vector<my_obj*>*,這是而不是foo相同的類型(最後*是什麼使它們不同)。 foo是一個對象,std::vector<my_obj*>*是一個指向對象的指針。

對象(而不是指針或引用)具有特定的生命週期。如果您創建了一個指向new的對象的指針,則指向該對象的生命週期將一直顯示爲delete。如果您創建一個對象作爲另一個對象的成員,那麼該內部對象的生命週期將(或多或少)鏡像外部對象的生命週期。如果您在堆棧上創建一個對象(函數範圍中的參數或變量),那麼它的生命週期就是該變量名的當前範圍。

6

因爲bar包含std::vector,而不是std::vector *

這東西真的沒有不同的是這樣的:在這個庫

class bar 
{ 
    int foo; // No need to create a "new int" 
}; 
1

的std ::向量不是指針

0

std::vector<my_obj *> foostd::vector<my_obj *> *foo不同。第二種情況將需要你使用新的,而第一個不會。

2

因爲std::vector會替你:)你沒有指針std::vector,你只需設置std::vector類型,其內部爲你分配內存的對象。

0

你並不需要在foo使用new,因爲foo是一個vector,而不是一個指向vector(即std::vector<my_obj*> *foo)。

如果您來自Java或C#,您可能需要考慮使用std::vector<my_obj>(對象向量)而不是指針向量。這真的取決於你想要做什麼。

3

因爲foo是一個不是指針的對象。

std::vector<my_obj*> // This is an object 
std::vector<my_obj*> * // This is a pointer to an object 
        ^^^ // Notice the extra star. 

新rerturns指針:

new std::vector<my_obj*>(); // returns std::vector<my_obj*> * 

PS。你的矢量應該可能包含對象而不是指針。

std::vector<my_obj> foo; 
... 
foo.push_back(my_obj()); 

否則當向量超出範圍時(包含對象被銷燬時),您將需要手動刪除向量中的所有對象。即如果你想在你的向量中保留指針,你應該執行以下操作之一:

// 1. Manually delete all the elements in the vector when the object is destroyed. 
~bar::bar() 
{ 
    for(std::vector<my_obj*>::iterator loop = foo.begin(); loop != foo.end(); ++loop) 
    { 
     delete (*loop); 
    } 
} 

// 2. Use a smart pointer: 
std::vector<std::shared_ptr<my_obj> > foo; 

// 3. Use a smart container for pointers 
boost::ptr_vector<my_obj> foo 
相關問題