すべてのブログすべてのモットー:今日と明日を照らしてください。
0.はじめに
c ++で4つの領域を記録するだけです
1.テキスト
機能:さまざまな領域に保存されたデータにより、さまざまなライフサイクルが得られ、プログラミングの柔軟性が高まります。
1.1プログラムを実行する前に
プログラムのコンパイル後、exe実行可能ファイルが生成されます。このファイルは、プログラムが実行される前に2つの領域に分割されます。
1.1.1コードエリア
オペレーティングシステムによって管理される関数本体のバイナリコードを格納します
- CPUによって実行された機械命令を保存します
- コード領域は共有され、共有の目的は頻繁に実行されるプログラムのためであり、コードのコピーのみがメモリに必要です。
- コード領域は読み取り専用です。読み取り専用にする理由は、誤って命令を変更しないようにするためです。
1.1.2グローバルエリア
グローバル変数と静的変数および定数を保存します
- グローバル変数と静的変数はここに保存されます
- グローバル領域には定数領域も含まれ、文字列定数およびその他の定数(定数変更されたグローバル定数)もここに格納されます
- この領域のデータは、プログラムの終了後にオペレーティングシステムによってリリースされます
概要:
- C ++のプログラムは、実行前にグローバル領域とコード領域に分割されます
- コードエリア機能は共有され、読み取り専用です
- グローバル領域には、グローバル変数、静的変数、および定数が格納されます
- 定数領域には、定数で変更されたグローバル定数と文字列定数が格納されます
1.2プログラムの実行後
1.2.1スタックエリア
これは、コンパイラによって自動的に割り当てられて解放され、関数パラメータ値、ローカル変数などが格納されます。
注:ローカル変数のアドレスを返さないでください。スタック領域のデータはコンパイラによって自動的に解放されます。
#include<iostream>
using namespace std;
int * func(int b) // 形参数据也会存放在栈区
{
b = 100;
int a = 10; // 局部变量存放在栈区,栈区数据在函数执行完成自动释放
return &a; // 返回局部变量的地址
}
int main()
{
// 接受func函数的返回值
int *p = func(1);
cout << *p << endl; // 第一次打印正确的数字,是因为编译器做了保留
cout << *p << endl; // 第二次这个数据就不再保留了
cout << *p << endl;
cout << *p << endl;
system("pause");
}
1.2.2スタック領域
プログラマーによって割り当てられ、プログラマーがそれを解放しない場合、オペレーティングシステムはプログラムの終了時にそれを再利用します
。C++では、newは主にヒープ領域のメモリを開くために使用されます。
#include<iostream>
using namespace std;
int * func()
{
// 利用new关键字,可以将数据开辟到堆区
// 指针 本质是局部变量,放在栈上,指针保存的数据,存放在堆区
int *p = new int(10); //
return p;
}
int main()
{
int *point = func();
cout << "函数返回值为:" << *point << endl;
system("pause");
}
概要:
- ヒープ領域データは、プログラマーによって開かれ、解放されます
- ヒープ領域データは、新しいキーワードを使用してメモリを開きます
1.3新しいオペレーター(添付)
- new演算子を使用して、C ++のヒープ領域のデータを開きます
- ヒープ領域に作成されたデータは、プログラマーがuse演算子deleteを使用して手動で作成し、解放します。
- 構文:新しいデータタイプ
- newで作成されたデータは、データに対応するタイプポインタを返します
#include<iostream>
using namespace std;
// 1. new的基本语法
int *func()
{
// 在堆区创建整型的数据
// new返回的是该数据类型的指针
int *p = new int(10);
return p;
}
// 2. 在堆区利用new开辟数组
void test02()
{
// 创建10整型的数据,在堆区
int *arr = new int[10]; // 10代表数组个数有10个
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
// 释放堆区的数组,释放数组,要加 [ ] 才可以
delete[] arr;
}
void test01()
{
int *p = func();
cout << *p << endl;
cout << *p << endl;
// 堆区的数据,由程序员管理开辟,程序员管理释放
// 如果想释放堆区的数据,利用关键字delete
delete p;
//cout << *p << endl; // 内存已经被释放,
}
int main()
{
//test01();
test02();
system("pause");
}