new和delete,new[],delete[]的簡單模擬實現
阿新 • • 發佈:2019-01-13
我們清楚new,delete在底層通過呼叫operator new,operator delete來申請空間,和釋放空間,operator new, operator delete則在頂層也是呼叫malloc來申請空間,free來釋放空間。
好啦,通過這麼一個邏輯關係,我們完全可以通過malloc,free來模擬實現new,delete,new[],delete[]
當然還有一點我們需在某個空間地址上去呼叫某個函數了,那麼定位new我們必須用到了
看一下基本實現模式吧
- new實現
typedef Test T; #include <assert.h> T* New() { T* ret = (T*)malloc(sizeof(T)); if(NULL == ret) { assert(false); return NULL; } new(ret) T();//在ret地址上執行T型別的建構函式 return ret; }
- delete實現
void Delete(T* p)
{
if(NULL == p)
return;
p->~T();
free(p);
}
- new[]實現
T* NewArray(size_t count) { int* p = (int*)malloc(sizeof(T)*count + 4);//用於解構函式中儲存變數個數 if(NULL == p) { assert(0); return NULL; } *p = count; T* ret = (T*)(p+1);//把int型別p強轉成T型別 for(size_t i = 0; i < count; ++i) new(ret+i) T(); return ret; }
- delete[]實現
void DeleteArray(T* p)
{
if(NULL == p)
return;
int* pFree = (int*)p - 1;
int count = *pFree;
for(int i = count-1; i >= 0; --i)
p[i].~T();
free(pFree);
}