C++使用new和delete進(jìn)行動態(tài)內(nèi)存分配與數(shù)組封裝
1、使用new申請內(nèi)存
在某些情況下,程序只有在運(yùn)行期間才能確定所需內(nèi)存大小,此時應(yīng)該使用new申請內(nèi)存。申請成功的情況下會返回首地址,通過指向首地址的指針可以訪問申請的內(nèi)存,使用new申請內(nèi)存的的語法如下:
new 數(shù)據(jù)類型(初始化參數(shù)列表);
下面的例子定義了Duck類型的指針,并通過new申請內(nèi)存,返回的地址賦值給指針,如下:
/// 1、定義目標(biāo)類型的指針 Duck *pointerDuck; /// 2、使用new申請內(nèi)存 pointerDuck = new Duck(666); /// 3、使用指針調(diào)用對象public成員 printf("%d \n", pointerDuck->getAge());
需要注意的是:new返回的是地址,所以需要預(yù)先定義目標(biāo)類型的指針
2、使用delete釋放內(nèi)存
通過new申請的內(nèi)存必須通過delete才能釋放,如果不釋放就會導(dǎo)致“內(nèi)存泄漏”,使用delete釋放內(nèi)存的語法如下:
delete 指針名; /// 實(shí)例如下: delete pointerDuck;
此外,delete
語句執(zhí)行時會調(diào)用對象的析構(gòu)函數(shù)(對于自定義類型),同一內(nèi)存空間只能被delete一次,如果內(nèi)存空間被重復(fù)delete則會導(dǎo)致程序運(yùn)行錯誤。
3、使用new申請內(nèi)存時的初始值
按照對象是否具有構(gòu)造函數(shù),new申請內(nèi)存時根據(jù)類型是否有構(gòu)造函數(shù)分為下面兩種情況:
- 對于有構(gòu)造函數(shù)的對象,
new
會執(zhí)行相應(yīng)的構(gòu)造函數(shù); - 對沒有構(gòu)造函數(shù)的基本數(shù)據(jù)類型,如果在類型名后加()則使用0進(jìn)行初始化,但是不能使用具體值進(jìn)行初始化,類型名后不加()則不進(jìn)行初始化而是隨機(jī)值;
下面是沒有構(gòu)造函數(shù)的基本數(shù)據(jù)類型使用new的例子:
/// 類型名后無括號則隨機(jī)值? pointer = new int[3]; /// 類型名后有括號則使用0初始化 pointer = new int[3]();
4、使用new和delete申請和釋放數(shù)組空間
對于數(shù)組,使用new動態(tài)申請內(nèi)存空間的語法如下:
new 數(shù)據(jù)類型[數(shù)組長度]; /// 如下 pointer = new int[3]();
使用delete釋放內(nèi)存的語法如下:
delete[] 指針名; /// 如下 delete[] pointer;
5、用類封裝new申請和釋放的數(shù)組空間
使用new
申請數(shù)組,返回的地址作為指針的值。使用指針訪問數(shù)組存在越界的可能性,而且不便于數(shù)組功能的擴(kuò)展。下面通過自定義類,來實(shí)現(xiàn)數(shù)組的元素的賦值和訪問等功能擴(kuò)展,同時解決數(shù)組存在的訪問越界的問題,以及封裝數(shù)組空間的申請和釋放。下面分步驟分析整型數(shù)組的代碼編寫過程:
- (1)確定私有數(shù)據(jù)成員:數(shù)組大小
arraySize
和數(shù)組指針pointerInt需要聲明為私有數(shù)據(jù)成員; - (2)確定構(gòu)造函數(shù):構(gòu)造函數(shù)需要通過數(shù)組大小arraySize,使用new申請對應(yīng)長度的數(shù)組內(nèi)存空間,并將返回的地址賦值給指針pointerInt;
- (3)確定析構(gòu)函數(shù):析構(gòu)函數(shù)需要通過
delete
釋放pointerInt
申請的空間; - (4)確定get和set函數(shù):get和set函數(shù)需要進(jìn)行“越界檢查”,并完成取元素和設(shè)置元素值的功能;
下面是具體實(shí)現(xiàn)的代碼;
class ArrayOfInt { public: ? ? /// 構(gòu)造函數(shù)中使用new申請數(shù)組空間 ?? ?ArrayOfInt(int size) :arraySize(size){ ?? ??? ?pointerInt = new int[arraySize](); ?? ?} ? ? /// 析構(gòu)函數(shù)完成數(shù)組內(nèi)存釋放 ?? ?~ArrayOfInt() { delete pointerInt; }; ? ?? ? ? /// set函數(shù)進(jìn)行元素值的設(shè)置,并進(jìn)行越界檢查 ?? ?void setElement(int index, int value) { ?? ??? ?assert(index >= 0 && index < arraySize); ?? ??? ?*(pointerInt + index)=value; ?? ?} ? ? /// get函數(shù)進(jìn)行越界檢查并返回指定位置的元素值 ?? ?int getElement(int index) { ?? ??? ?assert(index >= 0 && index < arraySize); ?? ??? ?return *(pointerInt + index); ?? ?} private: ? ? /// 私有數(shù)據(jù)成員負(fù)責(zé)記錄數(shù)組長度和首地址 ?? ?int *pointerInt; ?? ?int arraySize; };
下面是使用這個數(shù)組的例子:
ArrayOfInt arrayOfInt(3); arrayOfInt.setElement(1, 666); printf("%d \n", arrayOfInt.getElement(1));
6、使用new申請多維數(shù)組
首先必須明確,基本類型的指針是不能用于二維或者更高維的數(shù)組的,下面定義的指針只能訪問一維數(shù)組:
int *pointer;
為了訪問n維數(shù)組,必須定義n-1維的指針數(shù)組:
int (*pointer)[2][3]; /// 第一維的[4]不是指針的維度 pointer = new int[4][2][3]();
到此這篇關(guān)于C++使用new和delete進(jìn)行動態(tài)內(nèi)存分配與數(shù)組封裝的文章就介紹到這了,更多相關(guān)C++動態(tài)內(nèi)存分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)二值圖像的邊緣光滑處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之哈夫曼樹的實(shí)現(xiàn)方法,簡單說明了哈夫曼樹的原理,并結(jié)合具體實(shí)例形式分析了C++實(shí)現(xiàn)哈夫曼樹的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11C++實(shí)現(xiàn)俄羅斯方塊(linux版本)
這篇文章主要為大家詳細(xì)介紹了linux版本C++實(shí)現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07QT使用udp實(shí)現(xiàn)發(fā)送與接收圖片
這篇文章主要為大家詳細(xì)介紹了QT如何使用udp協(xié)議實(shí)現(xiàn)發(fā)送與接收圖片功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12C語言實(shí)現(xiàn)員工工資管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02C語言實(shí)現(xiàn)考試報名管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)考試報名管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06