C++メモリの割り当てと管理

3035 ワード

一、C/C++の四つの基本関数
  • malloc:指定バイト数のメモリを申請し、申請したメモリの初期値が不確定です.
  • calloc:指定された長さのオブジェクトに、指定された数のメモリを格納できるメモリを割り当て、各ビットを0に初期化します.
  • realloc:以前に割り当てられたメモリの長さを変更し、長さを増やすと、コンテンツを別の十分な領域にコピーする必要がある場合がありますが、新規領域の初期値は不確定です.
  • alloca:スタックでメモリを申請し、プログラムがスタックを出ると自動的にメモリが解放されます.allocは移植性を備えておらず,従来のスタックのない機器では実現しにくい.

  • サンプルコード:
    #include 
    //  100    
    char *str = (char *)malloc(100);
    assert(str != nullptr);
    
    //         
    free(str);
    str = nullptr;
    

    二、C++中new/delete
  • new/new[]:malloc割り当てメモリを最下位レベルで呼び出し、コンストラクション関数を呼び出します.
  • delete/delete[]:まず構造関数を呼び出し、最下位でfree解放空間を呼び出す.
  • newはメモリを申請するときに必要なバイト数を自動的に計算しますが、mallocは申請メモリのバイト数を入力する必要があります.

  • サンプルコード:
    T* t = new T();      //     ,     
    delete t;            //     ,     
    

    三、new/deleteとmalloc/freeの10つの違いをまとめる
    とくせい
    new/delete
    malloc/free
    メモリ位置の割り当て
    じゆうきおくいき
    スタック
    正常な戻り値の割当て
    タイプポインタ
    void*(ポインタタイプ強制変換が必要)
    割当てに失敗した戻り値
    デフォルト投げ出しbac_alloc異常
    NULLを返します
    メモリサイズの割り当て
    コンパイラタイプに基づいて計算
    指定したバイト数を表示する必要があります
    配列の処理
    new[]
    バイト数表示指定の計算
    割り当てられたメモリの拡張
    直観的に処理できない
    realloc関数の使用
    相互呼び出し
    はい、具体的なoperator new/delete実装を見てください.
    呼び出し不可new
    メモリの割り当て時にメモリ不足
    ユーザーは、処理関数を指定したり、ディスペンサを再指定したりできます.
    ユーザーコードで処理できません
    関数の再ロード
    許可する
    許可しない
    コンストラクション関数とコンストラクション関数
    よびだし
    呼び出しなし
  • 結論:C++はオブジェクト向けのプログラミングに重点を置き、new/delete
  • を使用するのに適している.