C+++中静的記憶エリアとスタックとの違いについて詳しく説明します。
c++を勉強して、メモリの割り当てを知らないと、とても悲しいことです。また、C++プログラマがメモリを把握できず、メモリを理解できず、合格のC++プログラマにはなれないということもあります。一、メモリは基本的にプログラミング可能なメモリを構成していますが、基本的にはこのようないくつかの大部分に分けられます。彼らの機能は違っています。彼らの使い方も違います。静的記憶エリア:プログラムコンパイル時にメモリが割り当てられています。この中にはプログラムが存在する全動作期間があります。主に静的データ、グローバルデータ、定数を保存します。スタック:関数を実行すると、関数内のローカル変数の記憶ユニットは、スタック上で作成できます。関数の実行が終了すると、これらの記憶ユニットは自動的に解放されます。スタックメモリ割り当て演算は、プロセッサに内蔵されているコマンドセットで、効率が高いが、割り当てられたメモリ容量は限られている。ヒープエリア:ダイナミックメモリ割り当てとも呼ばれる。プログラムは実行時にMallocまたはnewで任意のサイズのメモリを申請し、プログラマは自分で適当な時にfreeまたはdeleteでメモリをリリースします。ダイナミックメモリの生存期間は私達が決められます。もしメモリを解放しないなら、プログラムは最後にダイナミックメモリをリリースします。しかし、良いプログラミング習慣は:もしあるダイナミックメモリがもう使わないなら、それをリリースしなければならない。そうでなければ、メモリ漏れ現象が発生したと思います。
二、三者の違いはコード段を通して、このような三部分のメモリにはどのような操作が必要かと違います。また、どのようなところに注意すべきかを確認します。例1:静的記憶領域とスタック
二、三者の違いはコード段を通して、このような三部分のメモリにはどのような操作が必要かと違います。また、どのようなところに注意すべきかを確認します。例1:静的記憶領域とスタック
char* p = “Hello World1”;
char a[] = “Hello World2”;
p[2] =‘A';
a[2] =‘A';
char* p1 = “Hello World1;”
というプログラムには誤りがあり、エラーはp[2]="A'という行のコードにおいて発生しました。なぜですか?変数pと変数配列aはスタック領域に存在します。しかし、データ「Hello World 1」とデータ「Hello World 2」は異なる領域に格納されています。データ「Hello World 2」は配列に存在するので、このデータはスタックに格納され、修正には問題がない。ポインタ変数pは、格納空間のあるアドレスだけを記憶することができるので、データ「ハローワールド1」は文字列の定数として記憶されています。p[2]により、静的記憶領域の第3のデータユニット、すなわち文字‘l’が格納されているユニットにアクセスすることができる。ただし、データ「Hello World 1」は文字列定数ですので、変更はできません。プログラム実行時にメモリエラーを報告します。そして、pとp 1に出力するとpとp 1に保存されているアドレスは全く同じです。例二:スタックエリアとヒープエリア
char* f1()
{
char* p = NULL;
char a;
p = return p;
}
char* f2()
{
char* p = NULL:
p =(char*)new char[4];
return p;
}
という二つの関数はいずれもある格納空間のアドレスを返すものですが、どちらの違いがありますか?f 1()関数は格納空間を返しますが、この空間は一時空間です。つまり、この空間は短いライフサイクルしかないです。そのライフサイクルは関数f 1()の呼び出しが終わると、その生命価値がなくなります。つまり、この空間は解放されます。したがって、f 1()関数を呼び出すと、プログラムに次のような文言があります。
char* p;
p = f1();
*p =‘a';
の場合、コンパイルはエラーを報告しませんが、プログラムが実行されると異常エラーが発生します。操作すべきではないメモリ(すなわち、リリースされた記憶空間)を操作しているからです。しかし、比較して、f 2()関数には何の問題もありません。newというコマンドはヒープの中に記憶空間を申請するので、申請が成功すれば、deleteまたはプログラムを終了しない限り、このメモリはずっと存在します。ヒープメモリは共有ユニットであり、複数の関数により共通にアクセスできることも理解できる。もしあなたが複数のデータを持って戻ってくる必要があるなら、仕方がないです。メモリを積むのはいい選択です。しかし、次のようなことは避けなければなりません。
void f()
{
…
char * p;
p =(char*)new char[100];
…
}
というプログラムは無意味で、大きな被害をもたらします。なぜなら、ヒープメモリを申請しましたが、pはヒープメモリの先頭アドレスを保存しました。しかし、この変数は一時変数で、関数呼び出しが終了するとp変数が消失します。つまり、このメモリの最初のアドレスを保存する変数はもうありません。私たちは永遠にそのメモリを使うことができなくなります。しかし、このヒープメモリはずっとあなたに使われています。(プログラムが終了するまでは、あなたもdeleteを持っていません。だから、このヒープメモリはずっと所有者が現在のあなたのプログラムです。)他のプロセスやプログラムは使えません。このような不道徳な「ごろつき行為」(私達は使わないが、他人に使わせない)をメモリリークといいます。つまり、スタックエリアとスタックエリアと静的記憶領域の間の最大の違いは、スタックのライフサイクルが短いことにある。ただし、ヒープ領域と静的記憶領域のライフサイクルは、プログラムのライフサイクルと同時に存在します。(プログラム実行中にメモリをdeleteしないと)、このような変数またはデータをグローバル変数またはデータにします。しかし、ヒープ領域のメモリ空間の使用はより柔軟であり、それはあなたが必要でない時にいつでもそれを解放することができるので、静的なメモリエリアはプログラムのライフサイクル全体にずっと存在します。