1. 程式人生 > >new和delete,new[],delete[]的簡單模擬實現

new和delete,new[],delete[]的簡單模擬實現

我們清楚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);
}