c++のスタックストレージとスタックストレージ

3164 ワード

まず、例を挙げます.
void f() { 
    int* p=new int[5];
  } 

newを見ると、まず、メモリの山を割り当てたと思います.ポインタpは?彼が割り当てたのはスタックメモリなので、スタックメモリにスタックメモリを指すポインタpが格納されているという意味です.プログラムでは、スタックに割り当てられたメモリのサイズを決定し、operator newを呼び出してメモリを割り当て、このメモリの最初のアドレスを返してスタックに入れます.
C++では、メモリはスタック、スタック、フリーストレージ、グローバル/静的ストレージ、定数ストレージの5つの領域に分かれています.
1.スタック
コンパイラによって必要なときに割り当てられ、必要でないときに自動的に明らかになる変数の記憶領域です.中の変数は通常局所変数、関数パラメータなどです.
2.スタックはnewによって割り当てられたメモリブロックであり、彼らの解放コンパイラは管理されず、私たちのアプリケーションによって制御され、一般的に1つのnewはdeleteに対応しなければならない.プログラマーが解放されていない場合は、プログラムが終了するとオペレーティングシステムが自動的に回収されます.
3.フリーストレージエリアはmallocなどによって割り当てられたメモリブロックで、彼はスタックとよく似ていますが、freeで自分の命を終わらせています.
4.グローバル/静的記憶領域、グローバル変数と静的変数は同じメモリに割り当てられ、以前のC言語では、グローバル変数は初期化されたものと初期化されていないものに分けられ、C++にはこの区別はなく、同じメモリ領域を共有していた.
5.定数記憶領域これは比較的特殊な記憶領域であり、彼らの中には定数が格納されており、修正は許されない(もちろん、不正な手段でも修正することができる)
注意:
1)プログラムでnew演算子を使用してスタックに空間を開いた後、データの使用が終わった後、必ずスタックに開いた空間を解放しなければならない.そうしないとメモリの漏洩が発生し、演算子deleteはnew演算子がスタックに開いた空間を解放するために使用される.
2)また,new演算子を用いて配列に割り当てられた空間を解放する場合,delete[]を用いて解放する必要がある.
3)プログラムでnew演算子を使用してスタックにスペースを割り当てるときは、現在のポインタがスタックのアドレスを指しているため、ポインタが指すアドレスを簡単に変更しないでください.これを他のアドレスを指すと、次のようなスタックスペースを解放できません.
int *data = new int[3];
int num = 10;
data = #

上記のコードでは、ポインタdataは、最初にスタック内のアドレス空間を指し、その後、整数変数numを指します.これにより、new演算子がスタック内で開いた空間が解放されず、最終的にメモリが漏洩することが許されません.
サンプルプログラム
int a = 0; //       
char *p1; //        
main() 
{ 
int b; //  
char s[] = "abc"; //  
char *p2; //  
char *p3 = "123456"; //123456    ,p3   。 
static int c =0//  (  )     
p1 = (char *)malloc(10); 
p2 = (char *)malloc(20); //     10 20         。
strcpy(p1, "123456"); 
//123456     ,         p3    "123456"       。 
}

参考ブログ:C++ストレージエリア詳細C/C++スタック