C ++動的割り当て(使用法とnewとmallocの違い)

参照:https://blog.csdn.net/zhong29/article/details/80930919
https://blog.csdn.net/nyist_zxp/article/details/80810742

1. mallocとfree1
。関数宣言:
void *malloc(int size);
説明:mallocはシステムに適用され、サイズバイトのメモリスペースを割り当てます。戻り値の型はvoid *です。

2.使用する

int* p;
p = (int*)malloc(sizeof(int));

free(p);//释放内存

Malloc関数の使用上の注意:
1)Mallocは不確定な型ポインターを返すため、返す前に強制的な型変換を行う必要があります。そうしないと、コンパイルエラーが発生します。

2)Mallocはメモリを割り当てるだけで、初期化はしません。メモリ空間の値はランダムである可能性があります。割り当てられたスペースが以前に使用されたことがない場合、各値は0になる可能性があります。それどころか、さまざまな値がスペースに残される可能性があります。

3)実際のパラメータは、割り当てる必要のあるバイトのサイズです。malloc(1)の場合、システムは1バイトのメモリスペースのみを割り当てます。このとき、int値がこのスペースに格納されている場合は、 intタイプが4バイトを占めるため、3バイトの未割り当てスペースがあり、システムは割り当てられた1バイトに基づいて3バイトのスペースを逆方向に割り当て、これは「その他」を占有します。 「others」の値は「。」の3バイトスペースでクリアされます。

4)割り当てられたスペースが使用されなくなったら、free関数を使用してこのメ​​モリスペースを解放します。

5)ポインタ自体ではなく、ポインタが指すメモリ空間が解放されます。ポインタは解放後も存在します(たとえば、ポインタのような変数はプログラムの最後でのみ破棄されます)。

int* p;
p = (int*)malloc(sizeof(int));

free(p);

int a = 10;
p = &a;//指针依旧存在且可以被赋值

3. malloc関数の動作メカニズム
1)malloc関数が呼び出されると、malloc関数は、(メモリヒープに存在する)空きリンクリストに沿って需要を満たすメモリブロックを探し、のメモリブロックを割り当てます。ユーザーに必要なサイズ、残りはリンクリストに戻ります。

2)free関数を呼び出すと、ユーザーが解放したメモリブロックをfreechainに接続します。

3)malloc関数が複数回呼び出された後、または呼び出された後、空きリンクリストは多くの小さなメモリフラグメントに分割されます。ユーザーがより大きなメモリスペースを申請すると、空きの要求を満たすメモリブロックがない場合があります。リンクリストこのとき、malloc関数は遅延を要求し、空きリンクリスト内の小さなメモリフラグメントを大きなメモリブロックに編成し、最後に戻ります。

4)要件を満たすメモリブロックを取得できない場合、malloc関数はNULLポインタを返すため、mallocを呼び出してメモリブロックを動的に適用する場合は、戻り値を判断する必要があります。

2、新規および削除
1、新規
1)形式:
new 类型名T(初始化参数列表)

2)機能:
プログラムの実行中に、T型オブジェクトを格納するためのメモリスペースを申請し、初期値リストに従って初期値を割り当てます。

3)結果:
成果-「T型ポインタは新しく割り当てられたメモリを指します。
失敗-」は例外をスローします。

例:

//开辟单地址空间
int *p = new int;  //开辟大小为sizeof(int)空间
int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。
//开辟数组空间
//一维
int *a = new int[100]{
    
    0};//开辟大小为100的整型数组空间,并初始化为0。
//二维
int (*a)[6] = new int[5][6];
//三维
int (*a)[5][6] = new int[3][5][6];
//四维及以上以此类推。

2.削除
1)フォーマット:
delete 指针p

2)機能:
ポインタ
pが指すメモリp解放するには、新しい操作の戻り値である必要があります。

3)例:

//释放单个int空间
int *a = new int;
delete a;
//释放int数组空间
int *b = new int[5];
delete []b;

3.2つの違い
1.属性
newとdeleteはC ++キーワードであり、コンパイラでサポートする必要があります。mallocとfreeはライブラリ関数であり、ヘッダーファイルのサポートが必要です。

2.パラメータ
new演算子を使用してメモリ割り当てを適用する場合、メモリブロックのサイズを指定する必要はありません。コンパイラはタイプ情報に従ってサイズを計算します。また、mallocは、必要なメモリのサイズを明示的に示す必要があります。

3.戻り値の型
new演算子メモリ割り当てが成功すると、オブジェクト型のポインタが返されます。型はオブジェクトと厳密に一致し、型変換は不要です。したがって、newは型の安全性に準拠した演算子です。mallocメモリ割り当ては成功しますが、void *を返し、void *ポインタを強制的な型変換によって必要な型に変換する必要があります。

4.カスタムタイプ
newは、最初に演算子new関数を呼び出して、十分なメモリを適用します(通常、最下層はmallocを使用して実装されます)。次に、型のコンストラクターを呼び出し、メンバー変数を初期化し、最後にカスタム型へのポインターを返します。deleteは、最初にデストラクタを呼び出し、次に演算子delete関数を呼び出してメモリを解放します(通常、最下層はfreeを使用して実装されます)。

malloc / freeはライブラリ関数であり、メモリを動的に適用および解放することしかできず、カスタムタイプのオブジェクトの構築と破棄を強制することはできません。

5.
C ++をオーバーロードすると、カスタム演算子のnew関数と演算子delete関数を使用して、動的メモリの割り当てを制御できます。

6、
新しいメモリ領域は2つのことを行います。メモリを割り当ててクラスのコンストラクタを呼び出します。削除は次のとおりです。クラスのデストラクタを呼び出してメモリを解放します。そして、mallocとfreeは、メモリを割り当てて解放するだけです。

new演算子は、フリーストアからオブジェクトにメモリスペースを動的に割り当てますが、malloc関数はヒープからメモリを動的に割り当てます。空きストレージ領域は、new演算子に基づくC ++の抽象的な概念です。new演算子を介したメモリアプリケーションはすべて、空きストレージ領域です。ヒープはオペレーティングシステムの用語であり、プログラムメモリを動的に割り当てるためにオペレーティングシステムによって維持される特別なメモリです。C言語はmallocを使用してヒープからメモリを割り当て、割り当てられた対応するメモリを解放します。空きストレージ領域はヒープと同じではありません。前述のように、新しいレイアウトをヒープ内に配置する必要はありません。

7.割り当ての失敗
新しいメモリの割り当てが失敗すると、bac_alloc例外がスローされます(try-catchが必要です)。Mallocは、メモリの割り当てに失敗するとNULLを返します。

8.メモリリーク
メモリリークはnewとmallocの両方で検出でき、newはどのファイルのどの行であるかを指定できますが、mallocは指定できません。

おすすめ

転載: blog.csdn.net/qq_43530773/article/details/113895903