分配 | 釋放 | 類屬 | 可否重載 |
malloc() | free() | C函數 | 不可 |
new | delect | C++表達式(expressions) | 不可 |
::operator new() | ::operator delect() | C++函數 | 可 |
allocator<T>::allocate() | allocator<T>::deallocate() | C++ 標準庫 | 可自由設計並以之搭配任何容器 |
-
部分使用代碼以及源碼
//*********************************
void* p1 = malloc(512); //512 bytes
free(p1);
//*********************************
complex<int>* p2 = new complex<int>; //one object
delete p2;
//*********************************
void* p3 = ::operator new(512); //512 bytes
::operator delete(p3);
//*********************************
//以下使用C++標準庫提供的 allocators
//其接口雖有標準規格,但實現廠商並未完全遵守;
//下面三者形式略異
#ifdef _MSC_VER
//以下兩函數都是 non-static,一定要通過object調用(常用匿名對象調用)
//以下分配3個 ints
int* p4 = allocator<int>().allocate(3,(int*)0); //申請時要標明類型,而且還要填入不知名的參數
allocator<int>().deallocate(p4,3); //釋放時要填入數量
#endif
#ifdef __BORLANDC__
//以下兩函數都是 non-static,一定要通過object調用(常用匿名對象調用)
//以下分配5個 ints
int* p4 = allocator<int>().allocate(5);
allocator<int>().deallocate(p4,5);
#endif
//2.9版本GUNC
#ifdef __GUNC__
//以下兩函數都是 static,可通過全名調用
//以下分配 512 bytes
void* p4 = alloc::allocate(512);
alloc::deallocate(p4,512);
#endif
//4.9版本GUNC
#ifdef __GUNC__
//以下兩函數都是 non-static,一定要通過object調用
//以下分配 7 個ints
int* p4 = allocator<int>().allocate(7);
allocator<int>().deallocate((int*)p4,7);
void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9);
__gnu_cxx::__pool_alloc<int>().deallocate((int*)p5,9);
#endif
課程學習來源自:侯捷 《講解C++內存管理》