C C 記憶體管理

2021-09-14 05:18:25 字數 1829 閱讀 5024

與malloc/free區別:

在之前的部落格:c:動態記憶體分配及系列函式**我們解釋過,c語言主要使用malloc/calloc/realloc/free進行動態記憶體管理;

void

test()

class

;int

main()

operator new&operator delete

我們來看看c++是如何實現這兩個函式的:

/*operator new:該函式實際通過malloc來申請空間,當malloc申請空間成功時直接返回;申請空間失敗,嘗試執行空間不足應對措施,如果改應對措施使用者設定了,則繼續申請,否則拋異常。

*/void

*__crtdecl operator

new(size_t size)

_throw1

(_std bad_alloc)

return

(p);

}/*operator delete: 該函式最終是通過free來釋放空間的

*/void

operator

delete

(void

*puserdata)

/*free的實現*/

#define free(p) _free_dbg(p, _normal_block)

如何自行實現
struct listnode

void

operator

delete

(void

* p)};

class

list

~list()

delete _head;

_head =

nullptr;}

private

: listnode* _head;

}

new定位表示式
class

date

private

:int _year;

int _month;

int _day;};

intmain()

與malloc/free區別:

型別使用

對自定義型別資料

效率返回值型別

malloc

函式申請失敗返回null,使用時需判空不調構造,申請是啥就是啥不初始化較高

void*(要強轉)

new操作符

申請失敗丟擲異常,使用時需捕獲異常operator new->malloc+執行建構函式完成成員變數初始化因為構造是在申請好的空間上進行初始化,所以先申請再構造

較低(因為是對malloc進行了封裝)

返回申請時填的型別

free

函式free非malloc/realloc/calloc申請空間,crash

與malloc配對使用

較高delete

操作符封裝free;delete最好對應new,否則不安全

呼叫析構函式+operator delete->free(因為析構函式是清理空間上的資源,所以得先清理,再釋放

較低(同理)

c c 記憶體管理

我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...

C C 記憶體管理

寫乙個好的c 程式,我們要懂得好多東西,比如說最基本的物件導向程式設計思想,c 的封裝 繼承 多型機制,設計模式等,還有乙個很重要的內容便是效能優化,像c c 這種接近底層的語言,追求的就是效能,與之相關的一項內容便是記憶體管理,記憶體分配要合理,禁止破壞記憶體,不能有記憶體洩漏,操作不好的話,程式...

C C 記憶體管理

1.相同點 失敗 null 2 使用之前都要進行判斷是否為空 3 釋放空間的方式 free 4 返回值 void 可以強制型別轉換 2.不同點 1 malloc 引數 位元組數 功能 負責將空間給出 2 calloc 引數 單個元素位元組數,元素個數 功能 給出空間,且對空間進行初始化為0 若p為n...