動態記憶體分配
雖然通過陣列就可以對大量的資料和物件進行有效地管理,但是很多情況下,在程式執行之前,我們並不能確切地知道陣列中會有多少個元素。這種情況下,如果陣列宣告過大,就會造成浪費;宣告過小,就會影響處理。
在c++中,動態記憶體分配技術可以保證程式在執行過程中按照需要申請適量記憶體,使用後釋放,從而避免只使用陣列時的兩難情況。
常見動態記憶體分配方式
方式特點new和delete
c++關鍵字;
以具體型別為單位進行記憶體分配;
申請單個型別變數時可進行初始化
malloc和free
c語言stdlib.h庫中提供的函式;
以位元組為單位進行記憶體分配;
不具備記憶體初始化特性。
new/delete和new/delete
1. 定位
new和delete為c++中的關鍵字,通過特殊的語法可以組成表示式。可以用於動態申請空間,並可在申請之後進行必要的初始化。
2. 基本語法
①變數申請
②陣列申請
③初始化
④釋放記憶體
new/delete、new/delete配對使用,即用new申請的記憶體,需要使用delete釋放;用new申請地記憶體,需要使用delete釋放。
3. 作用機制
①new和delete
new呼叫operator new標準庫函式分配空間
=> 呼叫型別的預設建構函式
=> 初始化元素
=> 返回指標
delete通過指標指向的析構函式,對開啟的檔案進行關閉
=> 呼叫operator delete釋放記憶體
②new和delete
大致與上面相同,呼叫operator new與operator delete 函式對若干個陣列物件釋放記憶體。但是在對於 非內建型別 或有 自定義析構函式的類 型別,new會多分配四個位元組以儲存陣列的大小,delete時則從陣列物件指標的前面四個位元組取出呼叫析構函式的次數,傳入c++標準庫中的operator delete函式的為將陣列物件的指標值減4。
因此,僅僅在物件為 內建型別 或無自定義的析構函式的類 型別時,才可以使用delete來釋放new申請的陣列空間。
但是,儘管知道了這些,保險起見最好還是嚴格配對使用new/delete和new/delete。
malloc和free
1. 定位
malloc為c語言stdlib.h庫中的函式,可以用於動態申請空間,在申請空間之後不會對記憶體進行必要的初始化。
c++可以相容大部分c語言的內容,malloc/free這一申請/釋放動態記憶體的方式在c++中用也是可以使用的。
2. 基本語法:
變數申請示例
異常處理
c++提供了兩種標準的檢查記憶體分配成功與否的機制。
1. 處理異常(handling exceptions)
分配記憶體失敗,型別為bad_alloc 的異常會被丟擲,如果沒有被特定的處理器處理,程式執行中止。
2. nothrow
當記憶體分配失敗,不丟擲bad_alloc 型別的異常,而是返回null指標,然後程式繼續執行。示例:
C語言動態記憶體分配
c語言動態記憶體分配 動態資料結構可以在執行時靈活新增 刪除或重排資料項。在執行時分配記憶體空間的過程稱為動態記憶體分配。記憶體分配函式如下 malloc 分配所需的位元組大小,並返回指向所分配空間的第乙個位元組的指標 calloc 為元素陣列分配空間,並初始化為零,然後返回指向該記憶體的指標 fr...
C語言 動態記憶體分配
c語言有儲存變數的區域稱之為棧 stack 除此之外 c語言還允許建立自己的動態記憶體區域 以存放一些臨時的資料 這區域稱之為 堆 heap 也就是存放執行時的資料 可以根據程式的需要 向系統申請所需大小的空間 由於未宣告部分定義他們為變數或者陣列因此只能通過指標去訪問 建立記憶體動態分配主要由4個...
C語言 動態記憶體分配
動態記憶體分配 一.記憶體的五個分割槽 1.棧區後進先出,從高到底分配記憶體 int a 2 int b 3 printf 棧區 p n a printf 棧區 p n b 2.堆區 堆區分配記憶體,從低到高 堆區的記憶體由我們自己進行分配和釋放 int c malloc 10 printf 堆區 ...