操做系統
VirtualAlloc
須要程序員控制 內存空間分配 / 頁調撥
HeapAlloc
程序員不須要處理 內存空間 頁 問題 ,但須要本身建立堆 管理堆 銷燬堆
進程建立時有默認堆 .
程序員能夠HeapCreate建立自定義堆
GlobalAlloc / LocalAlloc
windows 16位操做系統用 ,已經廢棄,但爲兼容,仍可用
語言C++
malloc
提供動態內存分配
windows下
底層調用HeapAlloc
並非在進程默認堆申請,而是在運行時庫初始化建立的自定義堆分配
new 操做符程序員
分兩步:
1. 調用 operator new 分配內存
operator new 可重載 ,原型是 void * operator new(std::size_t ) throw(std::bad_alloc);
調用順序:
要申請內存的數據類型 T 的內部 operator new
數據類型 T 所屬命名空間的 operator new
全局 ::operator new
express
重載函數通常用 ::operator new / malloc 進行內存分配,加一些自定義內容?
windows
windows vs ::operator new 的默認實現
Release 模式下調用 malloc
Debug 模式是調用 _malloc_dbg 函數
2. 在1分配的內存上初始化對象
若是調用構造函數初始化對象失敗,會自動調用 operator delete() 釋放已經分配的內存
operator new 重載後,要重載對應的 operator delete,原型是 void operator delete(void *) throw();
其餘:
帶位置的 new 運算符(placement new)
語法: new (expression-list) new-type-id(optional-initializer-expression-list);
expression-list : 實參列表
new-type-id : 類型
optional-initializer-expression-list : 構造函數參數
這種形式的 new 運算符 首先調用 operator new(size_t,OtherTypeList) 來獲取內存,
而後對該對象執行構造函數.
語義上包括四種使用情形:
1. 直接給出要構建對象的內存位置
2. 不拋出異常,若是內存分配失敗返回空指針
3. 定製的/帶其餘參數的內存分配器
4. 用於調試目的,在構造函數調用失敗時給出源文件名和行號
通常調用就是指第一種情形,用於在一塊內存上調用 構造函數 (由於用戶不能顯示調用 構造函數 )
對應的 operator new(size_t,OtherTypeList) 由C++標準庫提供實現 頭文件<new>
inline void * operator new(std::size_t,void*__p)throw(){return __p;}
inline void * operator new[](std::size_t,void*__p)throw(){return __p;}
inline void operator delete(void *,void*) throw(){}
inline void operator delete[](void*,void*)throw(){}
由於經過 placement new 調用構造函數前,已經分配好了原始內存,
把內存地址經過 new (p) T(value) 傳遞給 operator new(size_t,void*)
帶位置的 operator new只須要直接返回內存地址就能夠
自定義參數的 operator new
operator new (size,Type1,Type2,...);
感受 operator new(size) / operator new(size,void*) 都是自定義參數 operator new 的一種特殊狀況
總的來講: new 運算符 會調用 operator new , 而後再調用構造函數
根據new 運算符不一樣的語法,調用不一樣的 operator new
1.普通的new運算符表達式 new Type(init value)
調用 void * operator new(std::size_t ) throw(std::bad_alloc);
2.帶位置的new運算符表達式 new(ptr) Type(init value)
調用 void * operator new(std::size_t,void*__p) throw();
由於是在已經分配好的內容 ptr 上面進行構造,
因此標準庫的 void * operator new(std::size_t,void*__p) 直接返回地址
3.自行定製參數的new運算符表達式 new (para) Type(init value)
調用 void * operator new(size, paraType)
操作系統