もちろん、以下はすべて正確ではありません。あなたがそれを読むとき、塩の粒と一緒にそれを取ってください:)
さて、あなたが言及する3つのことは、自動、静的、および動的なストレージ期間です。これは、オブジェクトの存続期間とオブジェクトの存続期間に関係しています。
自動保存期間
短命で小さなデータの自動ストレージ期間を使用します。これは、一部のブロック内でローカルにのみ必要です。
if(some condition) {
int a[3]; // array a has automatic storage duration
fill_it(a);
print_it(a);
}
寿命は、ブロックを終了するとすぐに終了し、オブジェクトが定義されるとすぐに始まります。これらは最も単純な種類のストレージ期間であり、特定の動的ストレージ期間よりもはるかに高速です。
静的ストレージ期間
スコープがそのような使用を許可する場合(名前空間スコープ)、スコープがその出口を越えて存続期間を延長する必要があるローカル変数(ローカルスコープ)には、任意のコードによって常にアクセスされる可能性がある自由変数に静的ストレージ期間を使用します。クラス(クラススコープ)のすべてのオブジェクトで共有する必要があるメンバー変数用。それらの存続期間は、そのスコープに依存します。名前空間スコープ、ローカルスコープ、クラススコープを持つことができます。どちらの場合も、彼らの人生が始まると、プログラムの終わりに人生が終わります。次に2つの例を示します。
// static storage duration. in global namespace scope
string globalA;
int main() {
foo();
foo();
}
void foo() {
// static storage duration. in local scope
static string localA;
localA += "ab"
cout << localA;
}
ブロックの終了時に破棄されないababab
ため、プログラムはを出力localA
します。ローカルスコープを持つオブジェクトは、制御がその定義に到達したときに存続期間を開始すると言えます。のlocalA
場合、関数の本体に入ったときに発生します。名前空間スコープ内のオブジェクトの場合、存続期間はプログラムの起動時に始まります。クラススコープの静的オブジェクトについても同様です。
class A {
static string classScopeA;
};
string A::classScopeA;
A a, b; &a.classScopeA == &b.classScopeA == &A::classScopeA;
ご覧のとおり、classScopeA
はそのクラスの特定のオブジェクトにバインドされていませんが、クラス自体にバインドされています。上記の3つの名前すべてのアドレスは同じで、すべて同じオブジェクトを示します。静的オブジェクトがいつどのように初期化されるかについては特別なルールがありますが、ここではそれについては気にしません。これは、静的初期化順序fiascoという用語が意味します。
動的ストレージ期間
最後の保存期間は動的です。オブジェクトを別の島に配置し、それらを参照するポインターを配置したい場合に使用します。オブジェクトが大きい場合や、実行時にのみ既知のサイズの配列を作成する場合にも使用します。この柔軟性のため、動的な保存期間を持つオブジェクトは複雑で、管理が遅くなります。その動的な期間を持つオブジェクトは、適切な新しいオペレーター呼び出しが発生したときに存続期間を開始します。
int main() {
// the object that s points to has dynamic storage
// duration
string *s = new string;
// pass a pointer pointing to the object around.
// the object itself isn't touched
foo(s);
delete s;
}
void foo(string *s) {
cout << s->size();
}
それらの寿命は、削除を呼び出すときにのみ終了します。それを忘れた場合、それらのオブジェクトは寿命を終えることはありません。また、ユーザーが宣言したコンストラクタを定義するクラスオブジェクトは、デストラクタが呼び出されません。動的なストレージ期間を持つオブジェクトは、そのライフタイムと関連するメモリリソースを手動で処理する必要があります。ライブラリは、それらの使用を容易にするために存在します。特定のオブジェクトの明示的なガベージコレクションは、スマートポインターを使用して確立できます。
int main() {
shared_ptr<string> s(new string);
foo(s);
}
void foo(shared_ptr<string> s) {
cout << s->size();
}
deleteの呼び出しについて気にする必要はありません。オブジェクトを参照する最後のポインターがスコープから外れた場合、共有ptrが代わりに実行します。共有ptr自体には自動保存期間があります。したがって、その存続期間は自動的に管理され、デストラクタ内のポイントされた動的オブジェクトを削除する必要があるかどうかを確認できます。shared_ptrのリファレンスについては、ブーストドキュメントを参照してください:http : //www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm