記事のディレクトリ
1.メモリパーティションモデル
C ++プログラムは、操作中にメモリを4つの領域に分割します
- コード領域:オペレーティングシステムによって管理される関数本体のバイナリコードを格納します
- グローバル領域:グローバル変数と静的変数および定数を格納します
- スタック領域:コンパイラによって自動的に割り当てられ、関数パラメータ値とローカル変数などが格納されます
- ヒープ領域:プログラマーによって割り当てられて解放されます。解放されない場合は、プログラムの終了後に自動的に解放されます。
グローバル領域とコード領域はプログラムの実行前に存在し、スタック領域とヒープ領域はプログラムの実行後にのみ存在します。
コードエリア
- CPUによって実行された機械命令を保存します
- コード領域は共有されます。共有の目的は、頻繁に実行されるプログラムのメモリにコードのコピーを保持することです。
- コード領域は読み取り専用です。読み取り専用にする理由は、プログラムが誤って命令を変更するのを防ぐためです。
グローバルエリア
- グローバル変数と静的変数はここに保存されます。
- グローバル領域には定数領域も含まれ、文字列定数やその他の定数もここに格納されます。
- この領域のデータは、プログラムの終了後にオペレーティングシステムによって解放されます。
スタックエリア
- コンパイラによって自動的に割り当ておよび解放され、関数パラメータ値、ローカル変数などが格納されます。
- 注:ローカル変数のアドレスを返さないでください。スタック領域で開かれたデータは、コンパイラによって自動的に解放されます。
ヒープ領域
- ヒープ領域データは、プログラマーによって開かれ、解放されます
- ヒープデータは
new
キーワードを使用してメモリを開きます
場合
#include <iostream>
using namespace std;
int main(int argc, char* agrv[])
{
// 利用new关键在在堆区开辟一块内存,new 返回是指定类型的指针
int* a = new int(10);
printf("%d\n",*a);
printf("%d\n", *a);
printf("%d\n", *a);
// 使用delete关键字释放
delete a;
// 将a指向null
a = NULL;
printf("%d\n",a);
return 0;
}
newを使用してデータを作成する
#include <iostream>
using namespace std;
int main(int argc, char* agrv[])
{
// 中括号代表在堆内存中新建数组
int* p = new int[10];
int i;
for (i = 0; i < 10; i++)
{
p[i] = i + 100;
}
for (i = 0; i < 10; i++)
{
printf("%d\n",*p);
p++;
}
return 0;
}
deleteキーワードはメモリを解放します
リリース変数
delete 变量名;
フリーアレイ
delete[] 数组名;