C/C++メモリ管理例について詳しく説明します。


1、メモリ割り当て方式
C++において、メモリは5つの領域に分けられ、それぞれヒープ、スタック、自由記憶領域、静的記憶領域、常量記憶領域である。

1)スタック
関数を実行すると、関数内のローカル変数の記憶ユニットがスタック上に作成され、関数の実行が終了すると、これらの記憶ユニットは自動的に解放されます。スタックメモリ割振り演算内蔵プロセッサ指令セットは効率が高いが、割り当てられたメモリ容量は限られている。
2)ヒープ
newで割り当てられたメモリブロックは、プログラマによって制御されます。プログラマが解放されなかったら、プログラム終了時にオペレーティングシステムによって回収されます。
3)自由記憶エリア
mallocなどに割り当てられたメモリーブロックは、freeで自分の生命を終了します。
4)静的記憶領域
大域変数と静的変数は同じブロックメモリに割り当てられます。C言語では、グローバル変数は初期化されたものと初期化されていないものに分類されます。
5)定数格納エリア
中には常量が保存されていますので、修正はできません。 
2、スタックとスタックの違い

int * ptr = (int*)malloc(sizeof(int)*4);
スタックには、メモリを指すポインタptrが格納されている。プログラムでは先にメモリのサイズを決めて、次にoperatonewを使ってメモリを割り当てて、このメモリの先頭アドレスを戻して、スタックに入れます。
1)空間の大きさが異なる
32ビットシステムでは、スタックの空間は4 Gであり、スタックの空間は小さい。
2)分配方式が異なる
ヒープは動的に割り当てられていて、静的に割り当てられていません。スタックの静的な割り当てはコンパイラで行われ、動的な割り当てはalloca関数で割り当てられます。スタックの動的割り当てはコンパイラによって解放される。
3)管理方式が異なる
スタックはコンパイラによって自動的に管理されます。ヒープのリリースはプログラマによってコントロールされます。
4)成長方式が異なる
ヒープの成長方式は上向きで、メモリアドレスに向かって増加する方向です。スタックの成長方式は下向きであり、メモリアドレスの減少方向である。
5)破片が発生するかどうか
ヒープに対して、頻繁なnew/deleteはメモリ空間の不連続をもたらし、大量の破片をもたらし、プログラムの効率を低下させます。
6)分配効率が異なる
スタックはマシンシステムのデータ構造であり、コンピュータは一階でスタックに対してサポートを提供します。専用のレジスタスタックのアドレスを割り当てて、スタックの出スタックには専用の命令があります。
ヒープはC/C++関数ライブラリで提供されています。ライブラリ関数は一定のアルゴリズムに従って、メモリの中で利用可能な十分なサイズの空間を検索します。十分なサイズの空間がないと、システム機能を呼び出してプログラムデータセグメントのメモリ空間を増やすことができます。
3、operator newとoperator delete
3.1なぜ重い荷物を運ぶべきですか?
埋め込みシステムでは、メモリの制限のために、頻繁に動的にサイズを割り当てるメモリが大きな問題を引き起こし、破損のリスクがあります。
newとdeleteを使用しなければならない時、C++のメモリ割り当てを制御しなければなりません。リロードされたグローバルnewとdeleteをシステムのメモリ割り当ての代わりに使う必要があります。クラスにnewとdeleteを積載する必要があります。
メモリの破損を防ぐ方法は、固定サイズの異なるメモリから異なる種類のオブジェクトを割り当てることです。一つの種類に対してnewとdeleteを重載して、メモリの割り当てを柔軟に制御することができます。
3.2グローバルのnewとdelete操作子を再負荷する

void* operator new(size_t size)
{
	void* p = malloc(size);
	return (p);
}

void operator delete(void*p)
{
	free(p);
}
3.3類重負荷newとdelete
単一クラスのためにnewとdeleteを再ロードします。

class TestClass
{
public:
	void* operator new(size_t size)
	{
		void* p = malloc(size);
		return p;
	}
	void operator delete(void* p)
	{
		free(p);
	}
};
単一クラスのためにnew[]とdelete[]を再ロードします。

class TestClass
{
public:
	void* operator new[](size_t size)
	{
		void* p = malloc(size);
		return p;
	}
	void* operator delete[](void* p)
	{
		free(p);
	}
}

int main()
{
	TestClass* p  = new TestClass[10];
	delete [] p; 
	return 0;
}
なお、new[]の個数パラメータは、配列のサイズと追加の記憶対象数のバイトである。メモリ割り当て機構の要因を考慮して、オブジェクト配列の使用をできるだけ避ける。
4、mallo c/freeがあって、なぜnew/deleteが必要ですか?
malloとfreeはC/C++言語の標準ライブラリ関数で、new/deleteはC++の演算子です。ダイナミックメモリの申請とメモリの解放に使用されます。
mallo c/freeは動的なオブジェクトの要求を満たすことができません。オブジェクトは作成と同時に自動的にコンストラクタを実行し、オブジェクトが消滅する前に自動的にコンストラクタを実行します。つまり、C++言語はダイナミックメモリ割り当てと初期化を完了する演算子newとメモリの整理とリリースを完了する演算子deleteが必要です。
内部データタイプの対象は解析と構造の過程がないので、彼らにとってはmalloc/freeとnew/deleteは等価です。
5、メモリがなくなった3つの解決方法
ダイナミックメモリを申請する時、十分大きいメモリブロックが見つからないので、mallocとnewはNULLポインタに戻ります。
1)ポインタがNULLかどうかを判断し、そうであれば、return終了関数を使用する。
2)判断ポインタがNULLかどうかは、exit(1)を使ってプログラムを終了します。
3)mallocとnewのために異常処理関数を設定します。
締め括りをつける
ここでC/C++メモリ管理に関する記事を紹介します。C/C++メモリ管理に関するものがもっと多いです。以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。