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);
4

1 に答える 1

2
  1. 特に指定していないため、ベクターに配置するオブジェクトにはstd::allocator<rabbit>、を使用するが割り当てられますnew。価値があるので、それは通常、ヒープ1ではなく「フリーストア」と呼ばれます。
  2. 繰り返しますが、通常の用語は無料ストアです。
  3. 公式には、これは「自動ストレージ」ですが、そうです、スタックとなる一般的な実装や、ハードウェアでスタックをサポートしない実装では、スタックのような(LIFO)データ構造のままになります。ある種の。
  4. アイテムをベクター(または他の標準コンテナー)に追加すると、コンテナーに実際に追加されるのは、パラメーターとして渡すアイテムのコピーです。パラメータとして渡す項目は、自由に使用できます。自動ストレージクラスを持つものの場合、スコープ外になると破棄されますが、コレクション内のコピーは、消去されるかコレクションが破棄されるまで有効です。
  5. newいいえ。実際、標準のコレクションに入れるアイテムの割り当てに使用することはめったにありません。配列内のアイテムは渡したもののコピーになるため、通常はnewそれを割り当てるために使用する必要はありません。
  6. 通常は、ローカルオブジェクトをプッシュバックするだけです。

例えば:

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

これにより、10個の一時rabbitオブジェクト(rabbit()パーツ)が作成され、それぞれのコピーがrabbitArmyに追加されます。その後、各一時的なものは破壊されますが、rabbitArmyにそれらのコピーが残ります。


  1. calloc通常の使用法では、「ヒープ」とは、、、、およびmallocによって管理されるメモリを指します。何を管理するかは無料ストアです。次に、新しい式は(グローバルまたはクラス内のいずれか)からメモリを取得します。とは、それぞれとへのほぼ直接のパススルーになるように指定されていますが、その場合でも、通常、ヒープストアとフリーストアは別々に考えられます。reallocfreenewdeleteoperator newoperator newoperator deletemallocfree
于 2013-02-13T05:02:02.687 に答える