分配層次
C++ memory primitives
分配 | 釋放 | 類型 | 是否可重載 |
---|---|---|---|
malloc | free() | C函數 | 不可 |
new | delete | C++表達式 | 不可 |
::operator new() | ::operator delete() | C++函數 | 可 |
allocator::allocate() | allocator::deallocate() | C++標準庫 | 可自由設計并以之搭配任何容器 |
分配與釋放的四個用法
1、malloc and delete
void* p1 = malloc(512); //512bytes
free(p1);
2、new and delete
complex<int>* p2 = new complex<int>; //one object
delete p2;
**3、::operator new() and ::operator delete() **
void* p3 = ::operator new(512); //512bytes,是個全局函數
::operator delete(p3);
4、allocator::allocate() and allocator::deallocate()
allocator就是分配器的名稱,用的時候要告訴它用的每個單元是什么,例如這里我們給它int,這樣就形成了一個type(類型).
類型名稱(typename)后面加上小括號(),就形成了一個臨時對象(建立的對象沒有名稱,生命周期只在使用的這一行)
注意GNUC,后面兩種是GNUC4.9版以后的寫法。向標準規范對齊了。
//以下使用C++標準庫提供的allocators *
//其接口具有標準規格,但是收到編譯器的影響,會有所不同。
#ifdef _MSC_VER//以下函數都是non-static,要通過object調用,以下分配3個ints.int* p4 = allocator<int>().allocate(3,(int*)10);allocator<int>().deallocate(p4,3);
#endif
#ifdef _BORLANDC_//以下函數都是non-static,要通過object調用,以下分配3個ints.int* p4 = allocator<int>().allocate(5);allocator<int>().deallocate(p4,5);
#endif
#ifdef _GNUC_//以下函數都是static,void* p4 = alloc::allocate(512);alloc::deallocate(p4,512);//以下兩函數都是 non-static,定要通過 object 調用。以下分配 7 個 ints. void* p4 = allocator<int>().allocate(7); allocator<int>().deallocate((int*)p4,7); //以下兩函數都是 non-static,定要通過 object 調用。以下分配 9 個 ints. void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9); __gnu_cxx::__pool_alloc<int>().deallocate((int*)p5,9);
#endif
參考:
https://www.bilibili.com/video/BV1Kb411B7N8?p=3