细说C++(十八):new和delete解析-重载 (二)

C++允许重载多个版本new()和delete()
但是重载的对象必须有独特的参数列
(1)new第一个参数必须是size_t
(2) delete 和 new 最好配对使用,但是若没用,编译器也不会error

成员operator new / delete

  • 构造对象过程解析(2步)

try {
void* mem=operator new(sizeof(foo)); //(1)先分配内存
p=static_cast<foo*>(mem);
p->foo::foo(); //(2)调用构造
}

  • 析构对象解析 (2步)

p->~foo();(1)先调用析构
operator delete§;(2)再释放内存


class foo{
	public:
		void* operator new(size_t);
		void* operator delete(void*,size_t)   //size_t is a optional;
};

int main()
{
	foo* p=new foo;
	/*
	. . .
	*/
	delete p;
	
	return 0;
	// 伪代码
}

成员operator new [ ] / delete [ ]

分析过程类型于上面(仅在大小,调用次数不同而已)


class foo{
	public:
		void* operator new[](size_t);
		void* operator delete[](void*,size_t)   //size_t is a optional;
};

int main()
{
	foo* p=new foo[n];   //n is the array size
	/*
	. . .
	*/
	delete p;
	
	return 0;
	
}

try {
	void* mem=operator new(sizeof(foo)*n+4);
	p=static_cast<foo*>(mem);
	p->foo::foo();  // n 次 
}

p->~foo();  // n 次 
operator delete(p);

全局作用域 ::operator new delete

直接看下面的实例代码即可:

new 参数传递大小size

delete 传递指针(地址)

(内部依然是包裹着malloc,free)


void* my_alloc(size_t size)
{
	return malloc(size);
} 

void* my_free(void* ptr)
{
	return free(ptr);
}

inline
void* operator new(size_t size)
{
	cout<<"my global new() \n"<<endl;
	return my_alloc(size);
}

inline
void* operator new[](size_t size)
{
	cout<<"my global new[]() \n"<<endl;
	return my_alloc(size);
}


inline
void operator delete(void* ptr)
{
	cout<<"my global delete() \n"<<endl;
	my_free(ptr);
}


inline
void operator delete[](void* ptr)
{
	cout<<"my global delete[]() \n"<<endl;
	my_free(ptr);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值