はじめに: 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.カスタムタイプ
- new の原理
1. 演算子 new 関数を呼び出してスペースを適用します。
2. 適用されたスペースでコンストラクターを実行して、オブジェクトの初期化を完了します。- 削除の原則
1. スペースに対してデストラクターを実行して、オブジェクト内のリソースのクリーンアップを完了します。
2. オペレーターの delete 関数を呼び出して、オブジェクトのスペースを解放します。- new T[n] の原理
1. 演算子 new[] 関数を呼び出し、実際に演算子 new[] 内で演算子 new 関数を呼び出して、n 個のオブジェクト空間に対するアプリケーションを完了します。
2.要求されたスペースでコンストラクターを n 回実行します。- delete[] の原理
1. 解放されたオブジェクト空間で n 個のデストラクターを実行し、n 個のオブジェクト内のリソースのクリーンアップを完了します。
2. スペースを解放するには、operator delete[] を呼び出します。実際には、operator delete[] の中で、operator delete が呼び出され、スペースが解放されます。
記事末尾BB: ご不明な点がございましたら、お気軽にコメント欄にメッセージを残してください。記載内容に誤りがある場合は、コメント欄でご指摘ください。ブロガーが作成します。見たらすぐに修正。最後に、作成するのは簡単ではありませんが、友人に役立つ場合は、ブロガーに「いいね」や注目を与えたいと思います。