到目前為止使用的所有變數在本教程中有乙個共同點:在編譯時必須宣告的變數。這將導致兩個問題:第一,很難有條件地宣告乙個變數,把它以外的在if語句塊(在這種情況下它將走出範圍塊結束時)。其次,所有陣列的大小必須提前決定程式的執行。例如,以下是不合法的:
然而,在許多情況下,這將是有用的能夠大小或調整陣列在程式執行。例如,我們可能想要使用乙個字串儲存人的名字,但是我們不知道他們的名字,直到他們進入多久。或者我們可能需要從磁碟讀取的記錄,但我們不知道有多少記錄。或者我們可以建立乙個遊戲,乙個變數數量的怪物追逐的球員。
如果我們有要申報的大小在編譯時的一切,最好的我們能做的就是盡量猜測變數的最大數量我們需要和希望就足夠了:
1
2
3
char
szname[25];
// let's hope their name is less than 25 chars!
record asrecordarray[500];
// let's hope there are less than 500 records!
monster asmonsterarray[20];
// 20 monsters maximum
這是乙個貧窮的解決方案有幾個原因。首先,它會導致浪費記憶體,如果變數沒有實際使用。例如,如果我們分配25字元每乙個名字,但是名字平均只有12個字元長,我們分配我們真正需要兩倍多!第二,它會導致人工限制和/或緩衝區溢位。當使用者試圖從磁碟讀入600條記錄嗎?因為我們只安排500空間,我們必須給使用者乙個錯誤,唯讀第乙個500條記錄,或者(在最壞的情況下,我們不處理這種情況下),我們溢位緩衝區和記錄程式崩潰。
幸運的是,通過動態記憶體分配這些問題很容易解決。動態記憶體分配允許我們分配記憶體的大小我們希望當我們需要它。
動態分配單一變數
動態地分配乙個變數,我們使用標量(非陣列)形式的新的操作符:
1
int
*pnvalue =
new
int
;
// dynamically allocate an integer
新的操作符返回的位址變數被分配。這個位址可以儲存在乙個指標,指標可以訪問該變數的引用。
當刪除乙個動態分配的陣列,我們必須使用陣列的版本刪除,刪除。這告訴cpu,它需要清理多個變數,而不是乙個變數。
注意陣列訪問相同的方式完成與動態分配的陣列與普通陣列。雖然這看起來有點滑稽,鑑於pnarray是顯式地宣告為指標,記住,只是指標陣列在c++中。
最常見的錯誤之一,新程式設計師在處理動態記憶體分配時使用刪除而不是刪除刪除乙個動態分配的陣列。不要這樣做!上使用的標量版本刪除陣列會導致資料損壞或其他問題。
記憶體洩漏
動態分配的記憶體沒有有效範圍。也就是說,它停留,直到顯式分配或分配,直到專案結束。然而,用於訪問動態分配的記憶體的指標遵循正常的範圍規則變數。這種不匹配可以建立有趣的問題。
shell程式的執行
編輯完該檔案之後不能立即執行該檔案,需給檔案設定可執行程式許可權。使用如下命令。root localhost bin chmod x date 執行shell程式有下面三種方法 方法一 root localhost bin date mr.root,today is 三月 30 星期一 wish y...
程式裝載(程式執行)
程式裝載時,將程式使用的虛擬記憶體位址和計算機實際分配的物理記憶體位址做了對映。程式裝載時獲取了一段連續空間,關閉該程式時,該程式雖然釋放了占用的記憶體空間,但是該記憶體空間並不一定與空餘記憶體空間連續,故其他程式申請時可能無法申請到該記憶體空間。如圖一。有一種解決辦法是記憶體交換,將程式放到硬碟中...
小程式執行執行過程原理 程式執行原理
計算機中包含有較多的硬體,但是乙個程式要執行,有三個核心的硬體,分別是 cpu 記憶體 硬碟 計算機中哪乙個硬體裝置負責執行程式?記憶體的速度快還是硬碟的速度快?我們的程式是安裝在記憶體中的,還是安裝在硬碟中的?我買了乙個記憶體條,有 500g 的空間!這句話對嗎?計算機關機之後,記憶體中的資料都會...