深入C++ new/delete,malloc/free

1. new的執行過程:
(1)通過operator new申請內存
(2)使用placement new調用構造函數(簡單類型忽略此步)
(3)返回內存指針
 
2. new和malloc的比較:
(1)new失敗時會調用new_handler處理函數,malloc不會,失敗時返回NULL
(2)new能通過placement new自動調用對象的構造函數,malloc不會
(3)new出來的東西是帶類型的,malloc是void*,需要強制轉換
(4)new是C++運算符,malloc是C標準庫函數
 
3. delete的執行過程:
(1)調用析構函數(簡單類型忽略此步)
(2)釋放內存
 
4.delete和free的比較
(1)delete能自動調用對象的析構函數,malloc不會
(2)delete是C++運算符,free是C標準庫函數
 
5. new的三種形態:new operator, operator new, placement new
(1)new operator
上面所說的new就是new operator,共有三個步驟組成(申請內存,調用構造函數,返回內存指針),對於申請內存步驟是通過運算符new(operator new)完成的,對於調用什麼構造函數,可以由placement new決定。
(2)operator new
像普通運算符一樣可以被重載,operator new會去申請內存,申請失敗的時候會調用new_handler處理,這是一個循環的過程,如果new_handler不拋出異常,會一直循環申請內存,直到成功。
重載運算符new
class Test
{
public:
   void* operator new(size_t size)
   { ...  }
};
operator new默認會去申請內存,成功了會返回內存地址,失敗了會調用new_handler,然後再去申請內存,一直循環。所以operator new要返回,必須滿足一下條件:
A. 在程序啓動的時候預留一部分內存,在new_handler裏釋放這部分內存,使得operator new能成功分配到內存
B.拋出bad_alloc異常
C.直接退出程序(abort, exit)
D.設置新的new_handler處理函數,set_new_handler(0)取消當前處理函數,默認拋出bad_alloc異常
(3)placement new
用於定位構造函數,在指定的內存地址上用指定類型的構造函數構造對象。
例如:new(ptr) Test("hello");// ptr->Test::Test("hello");
 
我們可以利用malloc+placement new來構建自己的內存管理模塊,創建對象時,通過malloc申請一個內存塊,然後調用placement new來完成對象的初始化;釋放對象時,首先調用對象的析構函數,然後通過free釋放空間.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章