C++クラシック面接問題|mallocとnewの違いは?

3814 ワード

問題解決の考え方:
(1)mallocとnewはいずれもスタック上でメモリを開くmallocはメモリを開くだけで、初期化機能がなく、ユーザー自身が初期化する必要がある.Newはメモリを開くだけでなく、new int(10)などの初期化も可能である.スタックに4バイトのint整形メモリが開いたことを示し、初期値は10であり、new int[10]()のようになっている.スタックに10個の整形要素を含む配列が開いていることを示し,初期値はいずれも0である.
(2)mallocは関数であり、メモリを開くにはmalloc(100)のような入力バイト数が必要である.スタックに100バイトのメモリが開いていることを示し、void*を返し、割り当てられたスタックメモリの開始アドレスを示すため、mallocの戻り値は指定されたタイプのアドレスに強く変換する必要がある.newは演算子であり,メモリを開くにはタイプを指定し,指定したタイプのアドレスを返す必要があるため,強転する必要はない.
スタックにint整形を開く場合:
int *p1 = (int*)malloc(sizeof(int));   
=>int *p2 = new int(0); 
=>        int0

int *p3 = (int*)malloc(sizeof(int)*100);  
=>    400100int *p4 = new int[100]();  
=>    4001000  

(3)mallocオープンメモリ失敗NULL,newオープンメモリ失敗bad_allocタイプの異常は、異常をキャプチャしてこそメモリの開発に成功したか失敗したかを判断することができる.new演算子はoperator new関数の呼び出しであり、その下位レベルで呼び出されたのもmallocでメモリを開拓したものであり、newはmallocより多くのものが初期化機能であり、クラスタイプにとって初期化とは、対応する構造関数を呼び出すことである.
(4)mallocが開いたメモリは常にfreeによって解放される.一方、new単一要素メモリはdeleteを使用し、new[]配列の場合、delete[]を使用してメモリを解放します.詳しい使用規則は私の前のブログを参照してください.https://blog.csdn.net/weixin_39411321/article/details/89310651
(5)mallocがメモリを開くには1つの方法しかないが,newには通常のnew(メモリの開発に失敗してbad_alloc異常を投げ出す),nothrowバージョンのnew,const new,および位置決めnewの4つがある.
ここで注意:mallocと聞けばmemcpyなどと聞く可能性もありますが、realloc関数はC++で使用できるかどうかは絶対にできません.これらの関数はメモリ値コピー(つまりオブジェクトの浅いコピー)を行っているので、浅いコピーという深刻な問題が発生します.