[C ++]メモリ4領域---コード領域、グローバル領域、スタック領域、ヒープ領域

すべてのブログすべてのモットー:今日と明日を照らしてください。

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");
}

おすすめ

転載: blog.csdn.net/weixin_39190382/article/details/108049471