C++ 基本構文 - 新しい、動的メモリ空間を開く/破棄するための削除

はじめに: C 言語には、動的メモリ空間を解放する malloc、realloc、および calloc と、動的メモリ空間を破壊する free があります。C++ では、動的メモリ空間を開くには new を使用し、動的メモリ空間を破棄するには delete を使用します。操作が簡素化されるだけでなく、さらに重要なことは、カスタム型の初期化問題を解決する

1. 操作の簡素化

使用法:new 类型 delete 指针
配列を作成します。new 类型[数据个数] delete[] 指针
コンパイラーは型のサイズを自動的に計算するため、型をキャストする必要はありません。これにより操作が大幅に簡素化されますが、次の 3 つの文に注意してください。これらは一致する方法で使用する必要があります。用途に合わせて!用途に合わせて!

	//int* a = (int*)malloc(sizeof(int));
	//free(a);
	int* a = new int;
	delete a;
	int* b = new int[10];
	delete[] a;

2. カスタム型の初期化問題を解決する(ポイント)

new/delete と malloc/free の最大の違いは、new/delete はカスタム型用のスペースを開くだけでなく、コンストラクター/デストラクターを呼び出す
new はコンストラクターを呼び出し、delete はデストラクターを呼び出します。

スタック クラスを例に挙げます。

typedef int DataType;
class Stack {
    
    
public:
	Stack(int capacity = 4)//构造函数 
	{
    
    
		_arr = new DataType[capacity];
		_capacity = capacity;
		_size = 0;
	}
	void StackPush(DataType Data)
	{
    
    
		_arr[_size] = Data;
		_size++;
	}
	~Stack() //析构函数
	{
    
    
		delete[] _arr;
		_capacity = _size = 0;
	}
private:
	DataType* _arr;
	int _capacity;
	int _size;
};
int main()
{
    
    
	Stack* ptr = (Stack*)malloc(sizeof(Stack)); //malloc开辟一个自定义的栈对象
	ptr->StackPush(1); //压栈
	free(ptr);
	return 0;
}

コンソールには次のように表示されます。 0 以外がプログラム エラーを意味することはわかっていますが、なぜ上記のコード エラーが発生するのでしょうか? これが私たちが強調していることですmalloc は単にスペースを開くだけであり、カスタム タイプ Stack のコンストラクターを呼び出しません。, 初期化はなく、初期化せずに内部のスタックをプッシュすると必ずエラーが発生します。
ここに画像の説明を挿入

new や delete に変更してもエラーは報告されません。

int main()
{
    
    
	Stack* ptr = new Stack;
	ptr->StackPush(1);
	delete ptr;
	//free(ptr)  不行,free不会去调用析构函数,资源得不到清理。
	return 0;
}

3. New は失敗をチェックせず、例外をスローします。

malloc を使用してスペースを開くとき、通常はスペースのオープンに失敗しないように if 条件文を書きますが、new は失敗をチェックしなくなり、エラーが発生した場合は直接例外をスローします。新しいため、スペースの確保に失敗するのを防ぐために if 条件を記述する必要はありません。

void Func()
{
    
    
	//malloc
	int* a = (int*)malloc(sizeof(int)*10);
	if (a == nullptr) //if判断
	{
    
    
		return;
	}
	free(a);
	//new
	int* b = new int[10];
	delete[] b;
}

1. 例外をスローする

malloc を使用して同じサイズのスペースを開くとエラーは表示されませんが、新しい場合はエラーが表示されます。
ここに画像の説明を挿入

2. 例外のキャッチ (トライキャッチ)

try と catch を使用して例外をキャッチし、例外の原因を見つけます。

int main()
{
    
    
	try
	{
    
    
		char* p2 = new char[0x7fffffff];
	}
	catch (const exception& error)
	{
    
    
		cout << error.what() << endl;
	}
	

コンソールには次のように表示されます。
ここに画像の説明を挿入

例外が発生すると、実行フローのジャンプが発生し、例外後のコードは実行されません。

int main()
{
    
    
	try
	{
    
    
		cout << "正常" << endl;
		char* p2 = new char[0x7fffffff];
		cout << "异常" << endl;
	}
	catch (const exception& error)
	{
    
    
		cout << error.what() << endl;
	}
	return 0;
}

コンソール出力は以下の通りです。 「例外」を出力するコードが実行されていないことがわかります。これは goto ステートメントに似ており、例外が発生した後は直接 catch ステートメントにジャンプします。この設計により、エラーが発生したときに後続のステートメントが実行されることがなくなり、ミスがさらに悪化することが防止されます。
ここに画像の説明を挿入

4. オペレータ新規/オペレータ削除機能

new と delete は、ユーザーが動的メモリを申請および解放するための演算子です。演算子 new と演算子 delete は、システムによって提供されるグローバル関数です。new は、スペースを申請するためにダンジョン内で演算子 new グローバル関数を呼び出し、delete は演算子 delete を使用しますグローバル関数を使用して、下部のスペースでそれを解放します。

演算子 new は、malloc 関数のカプセル化です。つまり、new によって生成されるスペースは、実際には malloc によって生成されます。違いは、malloc 関数はエラーが発生した場合に NULL を返すのに対し、C++ はエラーが発生した場合に例外を返す必要があるため、malloc 関数はカプセル化されていますが、エラーは例外を返します。
演算子削除の原理は演算子の原理と似ています。

以下のように、operator new/operator delete は malloc/free と同じように使用されます。

	int* a = (int*)malloc(sizeof(int) * 10);
	free(a);
	int* b = (int*)operator new(sizeof(int) * 10);
	operator delete(b);

1. 組み込み型

上記より、組み込みタイプのスペースを申請する場合、new と malloc、delete、free は基本的に同様です。違いは、new/delete は単一要素のスペースに適用して解放しますが、new[] と delete[] は連続スペースに適用して解放します。new はスペースの適用に失敗すると例外をスローし、malloc は戻ります。ヌル。

次の 3 つの方法はいずれも領域を解放できますが、実際にはすべて free を使用して領域を解放します。ただし、1 番目と 2 番目のオプションはお勧めできません。必ずご利用くださいマッチの使用特殊な状況を避けるため。

	int* a = new int[10];
	//都可以释放申请的空间
	//free(a);
	//delete a;
	delete[] a;

2.カスタムタイプ

  1. new の原理
    1. 演算子 new 関数を呼び出してスペースを適用します。
    2. 適用されたスペースでコンストラクターを実行して、オブジェクトの初期化を完了します。
  2. 削除の原則
    1. スペースに対してデストラクターを実行して、オブジェクト内のリソースのクリーンアップを完了します。
    2. オペレーターの delete 関数を呼び出して、オブジェクトのスペースを解放します。
  3. new T[n] の原理
    1. 演算子 new[] 関数を呼び出し、実際に演算子 new[] 内で演算子 new 関数を呼び出して、n 個のオブジェクト空間に対するアプリケーションを完了します。
    2.要求されたスペースでコンストラクターを n 回実行します
  4. delete[] の原理
    1. 解放されたオブジェクト空間で n 個のデストラクターを実行し、n 個のオブジェクト内のリソースのクリーンアップを完了します。
    2. スペースを解放するには、operator delete[] を呼び出します。実際には、operator delete[] の中で、operator delete が呼び出され、スペースが解放されます。

記事末尾BB: ご不明な点がございましたら、お気軽にコメント欄にメッセージを残してください。記載内容に誤りがある場合は、コメント欄でご指摘ください。ブロガーが作成します。見たらすぐに修正。最後に、作成するのは簡単ではありませんが、友人に役立つ場合は、ブロガーに「いいね」や注目を与えたいと思います。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_73390155/article/details/132378490