[C ++]メモリ管理

1. C / C ++メモリ分散

ここに画像の説明を挿入します

1.スタック領域は上位アドレスから下位アドレスに拡大し、非静的ローカル変数、関数パラメーターなどを
格納します。2。ヒープ領域は下位アドレスから上位アドレスに拡大し、malloc、新しい変数を格納します。
3.データセグメントはグローバル変数と静的変数を
格納します。4。コードセグメントは読み取り専用の一定の軽量で実行可能なコードを格納します。

2.C言語のメモリ管理から導入

C言語の動的メモリ管理:リンク
これは、基本的な使用法と一般的なエラーを含む、C言語でのメモリ管理の動的開発に関するブロガーの要約です。

3. C ++メモリ管理

C ++では、システムはメモリ管理用に2つのキーワードを定義しています。

組み込み型の基本操作

注:単一要素のスペースを申請および解放するには、newおよびdelete演算子を使用し、連続スペースを申請および解放するには、new []およびdelete []を使用します。
ここに画像の説明を挿入します

管理対象オブジェクト

	//申请空间
	int* ptr = new int;
	
	//申请空间并初始化
	int* ptr2 = new int(1);
	delete ptr;
    delete ptr2;
	

オブジェクトの配列を管理する

    //申请大小为4*10的连续空间
	int* arr = new int[10];
	//c++98不允许连续空间初始化
	//c++11后支持
	//	int *arr =new[10](1);(是错误代码)  
    delete[] arr;

カスタムタイプの基本操作

組み込み型と比較して、カスタム型のnew関数とdelete関数はより豊富です
。newはコンストラクターを呼び出して初期化します(newはスペースのアプリケーションのみです)
deleteはデストラクタを呼び出してスペースをクリーンアップします

#include <iostream>
using namespace std;
class Test
{
    
    
public:
	Test()
		: _data(0)
	{
    
    
		cout << "Test():" << this << endl;
	}
	~Test()
	{
    
    
		cout << "~Test():" << this << endl;
	}
private:
	int _data;
};
void Test2()
{
    
    
	// 申请单个Test类型的空间
	Test* p1 = (Test*)malloc(sizeof(Test));
	free(p1);
	// 申请10个Test类型的空间
	Test* p2 = (Test*)malloc(sizeof(Test) * 10);
	free(p2);
}
int main()
{
    
    
	Test* t = new Test;
	delete t;
	return 0;
}

ここに画像の説明を挿入しますそれらのコンストラクタとデストラクタが呼び出され、それが物理空間であることがわかります。
注:
1。動的スペースを開くには、デフォルトの構造が必要です。

演算子new和演算子削除

1. newおよびdeleteは、ユーザーが動的メモリを適用および解放するための演算子です。演算子newおよびoperator deleteは、システムによって提供されるグローバル関数です。newは、下部にある演算子newグローバル関数を呼び出してスペースを適用し、deleteは演算子deleteを使用します。下部にあるグローバル関数。スペースを解放します。
2.演算子newは、実際にmallocを介してスペースを申請します。mallocがスペースの申請に
成功すると、直接戻ります。それ以外の場合は、ユーザー提供のスペース不足対策が実行されます。ユーザーがそのような対策を提供した場合、アプリケーションは続行されます。それ以外の場合は、例外がスローされます。演算子deleteは、最終的に空き領域を解放します。

演算子newはmallocと例外処理メカニズムをカプセル化していることが理解できます。
ここに画像の説明を挿入します

New&Delete実現の原則

void test1(){
    
    
//内置类型
	int* ptr = new int;
	//new->operator new->malloc
	delete ptr;
	//delete->operator delete->free
	int* ptr1 = new int[10];
	//new[]-> operator new[]-> operator new->malloc
	delete[] ptr1;
	//delete[]->operator delete[]->operator delete->free

//自定义类型
	Test* t1 = new Test;
	//new->operator new->malloc->构造
	delete t1;
	//delete->析构->operator delete->free
	Test* t2 = new Test[10];
	//new[]->operator new[]->operator new->malloc->10构造
	delete t2;
	//delete[]->10析构->operator delete[]->operator delete->free


}

malloc / freeとnew / deleteの違い

  1. mallocとfreeは関数、newとdeleteは演算子です
  2. mallocによって要求されたスペースは初期化されません。新しいものは初期化できます。
  3. mallocがスペースに適用される場合、スペースのサイズを手動で計算して渡す必要があります。新規の後にスペースのタイプを入力するだけで済みます。
  4. mallocの戻り値はvoid *であり、使用時に強制する必要があります。newの後にスペースのタイプが続くため、newは必要ありません。
  5. mallocがスペースの適用に失敗すると、NULLを返すため、使用する場合はnullである必要があります。newは必要ありませんが、newは例外をキャッチする必要があります。
  6. カスタムタイプのオブジェクトを申請する場合、newはコンストラクタを呼び出してスペースの申請後にオブジェクトの初期化を完了し、deleteはデストラクタを呼び出してスペースを解放する前にスペース内のリソースのクリーンアップを完了します。

おすすめ

転載: blog.csdn.net/zhaocx111222333/article/details/114982845