記事のディレクトリ
1つは、メモリパーティションモデルです。
C ++プログラムが実行されると、メモリは一般的に次のように分割されます。4つのエリア
-
コード領域:オペレーティングシステムによって管理される関数本体のバイナリコードを格納します
-
グローバル領域:グローバル変数と静的変数および定数を格納します
-
スタック領域:コンパイラによって自動的に割り当てられて解放され、関数パラメータ値、ローカル変数などが格納されます。
-
ヒープ領域:プログラマーによって割り当てられて解放されます。プログラマーが解放しない場合、オペレーティングシステムはプログラムの最後にそれを再利用します。
== 4つのメモリ領域の意味:==異なる領域に格納されたデータは、異なるライフサイクルを提供し、プログラミングの柔軟性を高めます。
1.プログラムが実行される前
プログラムのコンパイル後、exe実行可能プログラムが生成されます。このプログラムは、プログラムが実行される前に2つの領域に分割されます。
コード領域:
-
CPUによって実行されるマシン命令を格納します
-
コード領域は共有はい、共有の目的は、頻繁に実行されるプログラムの場合、メモリ内にコードのコピーを用意するだけでよいということです。
-
コード領域は読み取り専用はい、読み取り専用にする理由は、プログラムが誤って命令を変更しないようにするためです。
グローバルエリア:
-
グローバル変数と静的変数ここに保存
-
グローバルエリアには、一定の面積、文字列定数およびその他の定数もここに格納されます
-
特徴:この領域のデータは、プログラムの終了後にオペレーティングシステムによってリリースされます
グローバル変数とローカル変数は、メモリ内の異なるメモリ領域に分散されます
グローバル変数は、関数に配置されない変数です
静的変数は、通常の変数の前に静的変数を追加することです
グローバル変数、静的変数、文字列定数、グローバル定数(定数変更されたグローバル定数)はグローバル領域に格納されます
ローカル変数とローカル定数(定数変更されたローカル変数)はグローバル領域にありません
例
#include<iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 20;
//全局常量
const int c_g_a = 10;
const int c_g_b = 20;
int main()
{
//局部变量
int a = 10;
int b = 20;
cout << "局部变量a的存放地址" << (int)&a << endl;
cout << "局部变量b的存放地址" << (int)&b << endl;
//局部常量
const int c_a = 10;
const int c_b = 20;
cout << "局部常量c_a的存放地址" << (int)&c_a << endl;
cout << "局部变量c_b的存放地址" << (int)&c_b << endl;
//全局变量
cout << "全局变量g_a的存放地址" << (int)&g_a << endl;
cout << "全局变量g_b的存放地址" << (int)&g_b << endl;
//全局常量
cout << "全局常量c_g_a的存放地址" << (int)&c_g_a << endl;
cout << "全局常量c_g_b的存放地址" << (int)&c_g_b << endl;
//静态变量
static int s_a = 10;
static int s_b = 20;
cout << "静态变量s_a的存放地址" << (int)&s_a << endl;
cout << "静态变量s_b的存放地址" << (int)&s_b << endl;
//字符串常量
cout << "字符串常量的存放地址" << (int) &"hello world" << endl;
system("pause");
return 0;
}
出力結果
2.プログラムの実行後
スタック領域:コンパイラによって自動的に割り当てられて解放され、関数パラメータ値、ローカル変数などが格納されます。
(注:ローカル変数のアドレスを返さないでください。スタック領域で開かれたデータは、コンパイラーによって自動的に解放されます)
ローカル変数、正式なパラメータデータスタック領域に格納されているスタック領域のデータは、関数の実行後に自動的に解放されます
ヒープ領域:プログラマーによって割り当てられて解放されます。プログラマーがそれを解放しない場合、オペレーティングシステムはプログラムの終了時にそれを再利用します。
new演算子:
C ++では、newは主に
ヒープ領域のメモリを開くために使用されます。ヒープ領域で開かれたデータは、プログラマーによって作成され、手動で解放され、解放されます。演算子delete
構文を使用します。newnew 数据类型
によって作成されたデータデータポインタに対応するタイプを返します
#include<iostream>
using namespace std;
int *func()
{
int * p = new int(10);
return p;
}
void test01()
{
int * p = func();
cout << *p << endl;
cout << *p << endl;
//堆区的数据不会自动释放,需要程序员操作
//如果想释放堆区的数据,利用关键字delete
delete p;
}
void test02()
{
//在堆区创建整型数据的数组,含有10个元素
int *arr = new int[10];
//释放数组
delete[] arr;
}
int main()
{
test01();
system("pause");
return 0;
}
[注]学習コースは-ダークホースプログラムC ++チュートリアル