2016-04-22 9 views
1

次のコードのスタックではどうなりますか?ベクトルのC++スタック割り当て

具体的には、tempはスタックに格納する必要がありますか?

次に、新しい空きベクトルにtempが割り当てられたら、2と3を含む前のtempはどうでしょうか?

スタック上に削除されていませんか?

誰が削除しますか?

int main() { 
vector<int> temp; 
temp.push_back(2); 
temp.push_back(3); 
temp = vector<int>(); 
} 
+0

"一時的に新しい空きベクトルに再割り当てされたとき" - いいえ一時空きベクトルの値が "temp"に割り当てられます。オブジェクト 'temp'はまだ存在し、スコープの終わりまで生存しています。その内部状態のみが代入演算子によって変更されます。 –

+0

なぜ物理メモリの場所を知る必要がありますか?仕様へのコード。 –

答えて

1

ステップバイステップ。

上記の行は、タイプvector<int>のローカル変数を作成します。 vectorクラスのメンバーはスタックしています。

vectorは、ヒープ上にデフォルト量のintを割り当てる場合があります。 (注:vectorクラスはヒープ上に割り当てるために、最初push_backを待ってもよい)、必要に応じて

temp.push_back(2); 

ベクターは、ヒープ上intの既定量を割り当てます。
パラメータがヒープ上の最初のスロットにコピーされます。
ベクトル内の状態変数が更新されます。
スタック上の領域割り当ては変更されません。

temp.push_back(3); 

ベクトルは、ヒープに割り当てられたメモリの2番目のスロットに値3を配置します。
ベクトル内の状態変数が更新されます。
スタック上の領域割り当ては変更されません。

temp = vector<int>(); 

tempは新しいベクターに割り当てられる。
ヒープ上の古いベクトル値は割り当て解除されます。
ベクトル内の状態変数が更新されます。
スタック上の領域割り当ては変更されません。

} 

tempベクトルがスタックから削除されます(そのデストラクタが呼び出されます)。
スタックは、mainが実行される前と同じサイズである必要があります。

ベクトルのデストラクタは、ヒープから割り当てたメモリを削除します。

編集1:
注:ベクトルの要素のストレージは実装依存です。ベクタはそのデータをスタックに格納することができます(クラス内の要素のデフォルト領域を持っています)。一般的な実装では、要素のヒープを使用します。

+0

_ "ベクトルを作成すると、ヒープにデフォルト量のintを割り当てることができます。" _これはどういう意味ですか?そして、このスタック/ヒープナンセンスの伝播をやめてください。このような実装の詳細から、C++は非常に設計通りのものです。 –

+0

申し訳ありませんが、初心者の言語を使用しています - ヒープとスタック。ベクトルは 'int'を格納するために動的メモリにデフォルト領域を作成します。つまり、ベクトルの初期のデフォルト容量があることを意味します。 –

+0

初心者がこの習慣の影響を最も受けていない場合、特に「間違った言語」の使用をやめて「初心者の言語」と呼ぶことをお勧めします。能力に関しては、それは100%不特定です。それは、当初の能力が全くない/可能である/可能/できない/可能性があります。 –