C++動的割り当てメモリ(newとdelete)、参照


C++動的割り当てメモリ
C++のメモリは2つの部分に分かれています.
  • スタック:関数内で宣言されたすべての変数がスタックメモリを占有します.
  • スタック:これはプログラムで使用されていないメモリであり、プログラムの実行時にメモリを動的に割り当てるために使用できます.定義された変数の特定の情報を格納するのにどれだけのメモリが必要かを事前に予知できない場合が多く、実行時に決定する必要があるメモリのサイズが必要です.C++では、特定の演算子を使用して、指定したタイプの変数の実行時にスタック内のメモリを割り当てることができます.これにより、割り当てられた空間アドレスが返されます.この演算子はnew演算子です.動的に割り当てられたメモリ領域が不要になった場合、delete演算子を使用して、new演算子で割り当てられたメモリを削除できます.

  • new演算子
    new演算子を使用して、任意のデータ型に動的メモリを動的に分散する共通文:
    new date-type;
    

    ここでdata-typeは、配列を含む任意の内蔵データ型であってもよいし、クラスや構造を含むユーザがカスタマイズした任意のデータ型であってもよい.まず、内蔵されているデータ型を見てみましょう.たとえば、doubleタイプへのポインタを定義し、実行時に割り当てられるメモリを要求できます.次の文に従ってnew演算子を使用して、この点を完了できます.
    double* pvalue  = NULL; //      null    
    pvalue  = new double;   //        
    

    フリー・ストレージ領域が切れている場合は、メモリの割り当てに失敗する可能性があります.したがって、new演算子がNULLポインタを返すかどうかを確認し、以下の適切な操作を行うことをお勧めします.
    double* pvalue  = NULL;
    if( !(pvalue  = new double ))
    {
         
       cout << "Error: out of memory." <<endl;
       exit(1);
     
    }
    

    例:
    #include 
    using namespace std;
    
    int main()
    {
         
        int* pi = new int(10);
        cout << *pi << endl;	//  :10
        delete pi;
        return 0;
    } 
    

    配列のダイナミックメモリ割り当て
    1次元配列:
    #include 
    using namespace std;
    
    int main()
    {
         
        int n;
        cin >> n;
        double* pd = new double[n];
        int i;
        for (i = 0; i < n; i++)
        {
         
            cin >> *(pd + i);
            cout << *(pd + i) << " ";
        }
        delete []pd;
        return 0;
    } 
    

    2 D配列:
    int **array
    //            m,        n
    //       
    array = new int *[m];
    for( int i=0; i<m; i++ )
    {
         
        array[i] = new int [n]  ;
    }
    //  
    for( int i=0; i<m; i++ )
    {
         
        delete [] arrary[i];
    }
    delete [] array;
    

    参照
    参照
    参照変数は別名です.つまり、既存の変数の別の名前です.参照を変数に初期化すると、その参照名または変数名を使用して変数を指すことができます.
    参照vsポインタ
    リファレンスはポインタと混同されやすく、3つの主な違いがあります.
  • に空の参照は存在しません.リファレンスは正当なメモリに接続する必要があります.
  • 参照が1つのオブジェクトに初期化されると、別のオブジェクトに指向することはできません.ポインタは、いつでも別のオブジェクトを指すことができます.
  • 参照は、作成時に初期化する必要があります.ポインタはいつでも初期化できます.

  • 例:
    int i = 17;
    int&  r = i;
    double& s = d;
    

    参照をパラメータとする
    すなわち、パラメータの参照を形式パラメータにコピーする参照呼び出しである.関数内で、この参照は呼び出しで使用する実際のパラメータにアクセスするために使用されます.これは、形式パラメータの変更が実際のパラメータに影響を与えることを意味します.一般的な使用方法は次のとおりです.
    date-type name(int &a,int &b)
    {
         
    、、、
    }
    

    参照パラメータと値パラメータを区別するには、関数宣言と関数定義ヘッダで、タイプ名の末尾に記号を付けます&
    参照を戻り値とする
    ポインタの代わりにリファレンスを使用すると、C++プログラムの読み取りとメンテナンスが容易になります.C++関数は、ポインタを返すのと同じように参照を返すことができます.
    関数が参照を返すと、戻り値を指す暗黙的なポインタが返されます.これにより、関数は付与文の左側に配置されます.例:
    #include 
    using namespace std;
    
    int a[5] = {
          0,1,2,3,4, };
    
    int& b(int i)
    {
         
        return a[i];
    }
    int main()
    {
         
        cout << "     :" << endl;
        for (int i = 0; i < 5; i++)
        {
         
            cout << a[i] << " ";
        }   //  :0 1 2 3 4
    
        b(1) = 99;
        cout << "
    "
    ; cout << " :" << endl; for (int i = 0; i < 5; i++) { cout << a[i] << " "; } // :0 99 2 3 4 return 0; }

    constのリファレンスへの応用
    例:
    #include 
    using namespace std;
    
    int main()
    {
         
        int b = 10;
        //int& rb = 20;   //     ,             
        const int& rb = 20; //   ,        
        return 0;
    }