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);
}

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/85780668
今日推荐