C 筆記 記憶體分配

2022-07-15 20:33:11 字數 1751 閱讀 1375

在學習c++控制記憶體分配部分主要區別以下幾組函式:

malloc/freeoperator new/deletenew operator/deleteplacement new/delete

二者都可以從堆中申請和分配動態記憶體,並且二者都必須成對匹配使用,才可以正確完成記憶體的的申請和釋放功能。

區別:malloc/free是標準庫中的函式,只能用來分配內部資料型別。

new/delete是c++編譯器自帶的操作符,並且new內建了sizeof、型別轉換和型別安全檢查功能。物件在建立的同時需要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務分配給malloc/free。因此,需要new和delete運算子,new能完成動態記憶體分配和初始化工作,delete能完成清理與釋放記憶體工作。

new operator/delete 即 new/delete,new用來完成物件的動態記憶體分配和初始化工作,delete用來完成清理與釋放記憶體工作,operator new/operator delete是位於對應類中的函式,負責記憶體的分配和釋放。

new operator/delete

new operator 在執行物件初始化時會有兩個步驟:1、呼叫operator new為物件分配記憶體;2、呼叫物件的建構函式初始化記憶體;3、返回相應指標

delete operator 執行時,也存在兩個步驟:1、呼叫物件的析構函式銷毀物件;2、呼叫operator delete釋放記憶體;3、讓給定指標為空

new operator/delete 不可以被過載,但使用者可以在類內部過載operator new函式operator delete函式

operator new/ delete

使用者可以根據需求對operator new進行過載。過載時:

1、返回型別必須宣告為void*;

2、第乙個引數型別必須為表達要求分配空間的大小(位元組被new呼叫),型別為size_t;

3、可以帶其它引數(new裡面引數,傳入operator new大小之後的引數列表)。

operator delete 過載時:

1、返回型別為void;

2、引數為需要銷毀的物件指標。

class

a

void

operator

delete (void*p)

}

placement new 是 operator new 過載的乙個版本,它不分配記憶體,可以將物件建立在已經被分配好的記憶體中,返回指向目標記憶體的乙個指標,稱為定位new。返回繁榮指標不能被刪除,需要呼叫物件的析構函式來銷毀,再delete原記憶體來釋放記憶體。不存在與定位new表示式相匹配的delete表示式。

placement new 使用步驟:

1、提前分配記憶體;

2、在已分配的記憶體上呼叫placement new建立物件;

3、使用物件;

4、使用完畢後呼叫物件的析構函式,銷毀物件;

5、可重複2、3、4步驟反覆利用已分配的記憶體,不再使用記憶體時,使用delete釋放。

classa​

void

main()

C 學習筆記之記憶體分配

靜態記憶體 staitc memory 儲存區域性static物件 類static資料成員 定義在任何函式之外的變數 棧記憶體 stack 儲存定義在函式內的非static物件 自由空間 free store 或稱堆記憶體 heap 儲存動態分配 即程式執行時分配 的物件 1.分配在靜態記憶體和棧記...

C 記憶體分配

總結 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是...

C 記憶體分配

c 中的記憶體主要分為五塊 全域性區 static 存放全域性變數或靜態變數 常量區 const 存放常量,不允許修改 可以通過特殊手段修改 堆 heap 由使用者自行分配和釋放,在程式執行時分配。由malloc分配,由free釋放 自由儲存區 free store 由new分配,由delete釋放...