C++使用new和delete進行動態內存分配與數組封裝

1、使用new申請內存

在某些情況下,程序隻有在運行期間才能確定所需內存大小,此時應該使用new申請內存。申請成功的情況下會返回首地址,通過指向首地址的指針可以訪問申請的內存,使用new申請內存的的語法如下:

new 數據類型(初始化參數列表);

下面的例子定義瞭Duck類型的指針,並通過new申請內存,返回的地址賦值給指針,如下:

/// 1、定義目標類型的指針
Duck *pointerDuck;
/// 2、使用new申請內存
pointerDuck = new Duck(666);
/// 3、使用指針調用對象public成員
printf("%d \n", pointerDuck->getAge());

需要註意的是:new返回的是地址,所以需要預先定義目標類型的指針

2、使用delete釋放內存

通過new申請的內存必須通過delete才能釋放,如果不釋放就會導致“內存泄漏”,使用delete釋放內存的語法如下:

delete 指針名;
/// 實例如下:
delete pointerDuck;

此外,delete語句執行時會調用對象的析構函數(對於自定義類型),同一內存空間隻能被delete一次,如果內存空間被重復delete則會導致程序運行錯誤。

3、使用new申請內存時的初始值

按照對象是否具有構造函數,new申請內存時根據類型是否有構造函數分為下面兩種情況:

  • 對於有構造函數的對象,new會執行相應的構造函數;
  • 對沒有構造函數的基本數據類型,如果在類型名後加()則使用0進行初始化,但是不能使用具體值進行初始化,類型名後不加()則不進行初始化而是隨機值;

下面是沒有構造函數的基本數據類型使用new的例子:

/// 類型名後無括號則隨機值 
pointer = new int[3];
/// 類型名後有括號則使用0初始化
pointer = new int[3]();

4、使用new和delete申請和釋放數組空間

對於數組,使用new動態申請內存空間的語法如下:

new 數據類型[數組長度];
/// 如下
pointer = new int[3]();

使用delete釋放內存的語法如下:

delete[] 指針名;
/// 如下
delete[] pointer;

5、用類封裝new申請和釋放的數組空間

使用new申請數組,返回的地址作為指針的值。使用指針訪問數組存在越界的可能性,而且不便於數組功能的擴展。下面通過自定義類,來實現數組的元素的賦值和訪問等功能擴展,同時解決數組存在的訪問越界的問題,以及封裝數組空間的申請和釋放。下面分步驟分析整型數組的代碼編寫過程:

  • (1)確定私有數據成員:數組大小arraySize和數組指針pointerInt需要聲明為私有數據成員;
  • (2)確定構造函數:構造函數需要通過數組大小arraySize,使用new申請對應長度的數組內存空間,並將返回的地址賦值給指針pointerInt;
  • (3)確定析構函數:析構函數需要通過delete釋放pointerInt申請的空間;
  • (4)確定get和set函數:get和set函數需要進行“越界檢查”,並完成取元素和設置元素值的功能;

下面是具體實現的代碼;

class ArrayOfInt {
public:
    /// 構造函數中使用new申請數組空間
    ArrayOfInt(int size) :arraySize(size){
        pointerInt = new int[arraySize]();
    }
    /// 析構函數完成數組內存釋放
    ~ArrayOfInt() { delete pointerInt; };
    
    /// set函數進行元素值的設置,並進行越界檢查
    void setElement(int index, int value) {
        assert(index >= 0 && index < arraySize);
        *(pointerInt + index)=value;
    }
    /// get函數進行越界檢查並返回指定位置的元素值
    int getElement(int index) {
        assert(index >= 0 && index < arraySize);
        return *(pointerInt + index);
    }

private:
    /// 私有數據成員負責記錄數組長度和首地址
    int *pointerInt;
    int arraySize;
};

下面是使用這個數組的例子:

ArrayOfInt arrayOfInt(3);
arrayOfInt.setElement(1, 666);
printf("%d \n", arrayOfInt.getElement(1));

6、使用new申請多維數組

首先必須明確,基本類型的指針是不能用於二維或者更高維的數組的,下面定義的指針隻能訪問一維數組:

int *pointer;

為瞭訪問n維數組,必須定義n-1維的指針數組:

int (*pointer)[2][3];
/// 第一維的[4]不是指針的維度
pointer = new int[4][2][3]();

到此這篇關於C++使用new和delete進行動態內存分配與數組封裝的文章就介紹到這瞭,更多相關C++動態內存分配內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: