2011-12-28 24 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の新しいインスタンスを割り当てる必要がないのはなぜですか?なぜ "new"を使用してstd :: vectorを初期化する必要はありませんか?

+0

彼らは言った。また、 'foo.push_back(new my_obj());'はお勧めできません。なぜなら、そこでメモリを解放する予定があるからです。 –

答えて

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番目のケースでは、最初のWllではなく新しいものを使用する必要があります。

2

std::vectorあなたには:std::vectorへのポインタがありませんので、内部的にメモリを割り当てているタイプstd::vectorのオブジェクトを設定するだけです。 fooは、vector(すなわちstd::vector<my_obj*> *foo)へのポインタvectorないので

0

あなたは、foonewを使用する必要はありません。

JavaまたはC#を使用している場合は、ポインターのベクトルの代わりにstd::vector<my_obj>(オブジェクトのベクトル)を使用することを検討してください。本当にあなたがしたいことにかかっています。

3

fooがオブジェクトではないポインタですので。

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

PS:

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

新ポインタをrerturns。ベクトルには、ポインタではないオブジェクトが含まれているはずです。

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 
関連する問題