次のコードのスタックではどうなりますか?ベクトルのC++スタック割り当て
具体的には、tempはスタックに格納する必要がありますか?
次に、新しい空きベクトルにtempが割り当てられたら、2と3を含む前のtempはどうでしょうか?
スタック上に削除されていませんか?
誰が削除しますか?
int main() {
vector<int> temp;
temp.push_back(2);
temp.push_back(3);
temp = vector<int>();
}
次のコードのスタックではどうなりますか?ベクトルのC++スタック割り当て
具体的には、tempはスタックに格納する必要がありますか?
次に、新しい空きベクトルにtempが割り当てられたら、2と3を含む前のtempはどうでしょうか?
スタック上に削除されていませんか?
誰が削除しますか?
int main() {
vector<int> temp;
temp.push_back(2);
temp.push_back(3);
temp = vector<int>();
}
ステップバイステップ。
上記の行は、タイプ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:
注:ベクトルの要素のストレージは実装依存です。ベクタはそのデータをスタックに格納することができます(クラス内の要素のデフォルト領域を持っています)。一般的な実装では、要素のヒープを使用します。
_ "ベクトルを作成すると、ヒープにデフォルト量のintを割り当てることができます。" _これはどういう意味ですか?そして、このスタック/ヒープナンセンスの伝播をやめてください。このような実装の詳細から、C++は非常に設計通りのものです。 –
申し訳ありませんが、初心者の言語を使用しています - ヒープとスタック。ベクトルは 'int'を格納するために動的メモリにデフォルト領域を作成します。つまり、ベクトルの初期のデフォルト容量があることを意味します。 –
初心者がこの習慣の影響を最も受けていない場合、特に「間違った言語」の使用をやめて「初心者の言語」と呼ぶことをお勧めします。能力に関しては、それは100%不特定です。それは、当初の能力が全くない/可能である/可能/できない/可能性があります。 –
"一時的に新しい空きベクトルに再割り当てされたとき" - いいえ一時空きベクトルの値が "temp"に割り当てられます。オブジェクト 'temp'はまだ存在し、スコープの終わりまで生存しています。その内部状態のみが代入演算子によって変更されます。 –
なぜ物理メモリの場所を知る必要がありますか?仕様へのコード。 –