首頁 > 軟體

C++使用new和delete進行動態記憶體分配與陣列封裝

2022-03-10 16:00:36

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++動態記憶體分配內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com