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

 更新時間:2022年03月10日 14:26:44   作者:機器學習入坑者  
這篇文章主要介紹了C++使用new和delete進行動態內存分配與數組封裝,運行期間才能確定所需內存大小,此時應該使用new申請內存,下面我們就進入文章學習具體的操作方法,需要的小伙伴可以參考一下

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++動態內存分配內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入理解c++中virtual關鍵字

    深入理解c++中virtual關鍵字

    本篇文章主要是對c++中virtual關鍵字進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-02-02
  • windows下安裝QT及visual studio 2017搭建開發環境

    windows下安裝QT及visual studio 2017搭建開發環境

    這篇文章主要介紹了windows下安裝QT及visual studio 2017搭建開發環境,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C++基礎入門教程(七):一些比較特別的基礎語法總結

    C++基礎入門教程(七):一些比較特別的基礎語法總結

    這篇文章主要介紹了C++基礎入門教程(七):一些比較特別的基礎語法總結,本文總結的都是一些特殊的語法,需要的朋友可以參考下
    2014-11-11
  • C語言編程const遇上指針分析

    C語言編程const遇上指針分析

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中當Const遇上指針的分析講解,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C++類的靜態成員初始化詳細講解

    C++類的靜態成員初始化詳細講解

    通常靜態數據成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時使用作用域操作符來指出靜態成員所屬的類.但如果靜態成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09
  • C++實現猜數游戲

    C++實現猜數游戲

    這篇文章主要為大家詳細介紹了C++實現猜數游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 應用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    應用程序操作NorFlash示例代碼分享(norflash接口使用方法)

    相對于操作NandFlash,操作NorFlash相對簡單,因為基本不需要考慮壞塊,NorFlash也沒有OOB區域,也跟ECC沒有關系。讀寫擦除相對容易,下面看個例子吧
    2013-12-12
  • C++ TensorflowLite模型驗證的過程詳解

    C++ TensorflowLite模型驗證的過程詳解

    這篇文章給大家介紹了C++ TensorflowLite模型驗證的過程,測試代碼,主要是RunInference()和read_file(),詳細操作過程跟隨小編一起看看吧
    2021-08-08
  • 可讀可執行的C語言簡歷源文件

    可讀可執行的C語言簡歷源文件

    這篇文章主要為大家家詳細介紹了可讀可執行的C語言簡歷源文件,感興趣的小伙伴們可以參考一下
    2016-07-07
  • C語言實現奇數階魔方陣的方法

    C語言實現奇數階魔方陣的方法

    這篇文章主要介紹了C語言實現奇數階魔方陣的方法,涉及數組及相關數學函數的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02

最新評論

免费人成视频在线观看