new表示式相關
new 表示式的操作序列如下從空閒儲存區分配物件然後用括號內的值初始化該物件
為從空閒儲存區分配物件new 表示式呼叫庫操作符new() 前面的new 表示式與下列**
序列大體上等價:
int ival = 0; // 建立乙個用 0 初始化的int 物件
int *pi = &ival; // 現在指標指向這個物件
當然不同的是pi 指向的物件是由庫操作符new()分配的位於程式的自由儲存區中
類似地如下語句.
istack *ps = new istack( 512 );
建立了乙個內含512 個元素的istack 型的物件在類物件的情況下括號中的值被傳遞
給該類相關的建構函式它在該物件被成功分配之後才被呼叫。
空懸指標
在這裡討論pi 的生命期和pi 指向的物件的生命期之間的區別是很重要的指標pi 本
身是個在全域性域中宣告的全域性物件結果pi 的儲存區在程式開始之前就被分配且一直保
持到程式結束這與pi 指向的物件的生命期不同後者是在程式執行過程中遇到new 表示式
時才被建立的pi 指向的記憶體是動態分配的它擁有的物件是動態分配的物件因此pi 是
乙個全域性指標指向乙個動態分配的int 型物件當程式執行期間遇到delete 表示式時pi
指向的記憶體就被釋放了但是指標pi 的記憶體及其內容並沒有受delete 表示式的影響在delete
表示式之後pi 被稱作空懸指標即指向無效記憶體的指標空懸指標是程式錯誤的乙個根源
它很難被檢測到乙個比較好的辦法是在指標指向的物件被釋放後將該指標設定為0 這
樣可以清楚地表明該指標不再指向任何物件
下面三個常見程式錯誤都與動態記憶體分配有關
1 應用delete 表示式失敗使記憶體無法返回空閒儲存區這被稱作記憶體洩漏memoryleak。
2 對同一記憶體區應用了兩次delete 表示式這通常發生在兩個指標指向同乙個動態分配
物件的時候這是乙個很難踉蹤的問題若多個指標指向同乙個物件當通過某乙個指標釋
放了該物件時就會發生這樣的情況此時該物件的記憶體被返回給空閒儲存區然後又被分
配給某個別的物件接著指向舊物件的第二個指標被釋放新物件也就跟著消失了。
3 在物件被釋放後讀寫該物件這常常會發生因為delete 表示式應用的指標沒有被設
置為0。
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...