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