學習筆記 new delete的堆記憶體操作

2021-10-03 03:30:52 字數 1700 閱讀 7594

c / c ++中的動態記憶體分配是指程式設計師手動執行記憶體分配。動態分配的內存在堆上分配,非靜態和區域性變數在堆疊上分配記憶體

有什麼應用?

他與分配給普通變數的記憶體有什麼不同?

如何在c ++中分配/取消分配記憶體?

普通陣列宣告與使用new

宣告普通陣列與使用new分配記憶體塊之間有區別。最重要的區別是,常規陣列由編譯器釋放(如果陣列是本地陣列,則在函式返回或完成時釋放)。但是,動態分配的陣列始終保留在那裡,直到程式設計師將其釋放或程式終止為止。

如果執行時沒有足夠的記憶體怎麼辦?

如果堆中沒有足夠的記憶體來分配,則新請求將丟擲std :: bad_alloc型別的異常,以指示失敗,除非new操作符使用了「 nothrow」,在這種情況下它將返回null指標。因此,最好在使用new程式之前檢查new產生的指標變數。

new初始化記憶體

float *q = new float(12.12)    //括號裡的表示值
new指標陣列:指標陣列適用於儲存字串。

char **t1 = new char* [10];

for (int i = 0; i < 10; ++i)

new二級指標

float **p = new float *;
new二維陣列

int (*p)[5] = new int[3] [5] //第一各個括號表示型別,第二個括號表示運算子
int *t1 = new int(7);

cout << t1 << " " << *t1 << endl;

// //0xe07ec8 7

string *t2 = new string("china"); //地位跟int一樣

cout << t2 << " " << *t2 << endl;

//0xe07ed8 china

char *t3 = "china";

cout << t3 <<" " << *t3 int main(int argc, char** ar**)

}}

這樣寫是c語言的做法,,不是c++。這套機制在c++失效了,因為他一旦申請空間失敗就直接拋異常,根本不會執行到exit(1)。

那我們又以怎樣的方式知道他是哪個申請失敗呢?

我們可以這樣

#include using namespace std;

int main(int argc, char** ar**)

}catch(bad_alloc & e)

cout << i << endl;

}}

刪除new建立的資料物件的指標:delete  指標變數

釋放指標變數指向的動態分配陣列:delete 指標變數

部分參考:

學習筆記 堆

heap 堆 堆是一種建立在樹上的結構,是一種完全二叉樹型的資料結構,目前了解到的應用是堆排序,然後用於實現優先佇列。堆的特點是,子結點一定比父結點大或者小於父結點。其中,所有子結點都小於父結點的堆是最大二叉堆,子結點小於父結點的是最小二叉堆。堆的核心是heapify,維護堆合法性的演算法 後續談到...

學習筆記 堆

include include typedef struct node minheap 初始化乙個堆 void create minheap h,int maxsize bool isfull minheap h 往堆裡插入資料,其實可以直接在主程式裡輸入就行了 void insert minhea...

堆學習筆記

完全二叉樹比較適合用陣列來儲存 堆化非常簡單,就是順著節點所在的路徑,向上或者向下,對比,然後交換。從堆的定義的第二條中,任何節點的值都大於等於 或小於等於 子樹節點的值,我們可以發現,堆頂元素儲存的就是堆中資料的最大值或者最小值 把最後乙個節點放到堆頂,然後利用同樣的父子節點對比方法。對於不滿足父...