C++重载new与delete

总结:

	//重载的new操作符 依然会触发对象的构造函数
	void * operator new(size_t size)
	{
		cout << "重载了new操作符" << endl;
		return malloc(size);
	}

	void *operator new[](size_t size)
	{
		cout << "重载了new[]操作符" << endl;
		return malloc(size);
	}

  //重载的delete操作符 依然会触发对象的析构函数
	void operator delete(void * p)
	{
		cout << "重载了delete操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

	void operator delete[](void *p)
	{
		cout << "重载了delete[]操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

探究

new与new[]

重载new与重载其他方法操作符有所不同

我们看下自带的new是怎么定义的

可以看见new操作符的一个参数是大小,返回值是万能指针;

平时使用new是   A a = new A();

从使用来分析左边是没有参数的,也就是只有一个参数size;

那我们重载也可以写成

void * operator new(size_t size);

返回值是一个指针,指针指向的就是对象的内存;那么写法就是

void * operator new(size_t size)
	{
		cout << "重载了new操作符" << endl;
		return malloc(size);
	}

同理 new[]也是一样的写法

void *operator new[](size_t size)
	{
		cout << "重载了new[]操作符" << endl;
		return malloc(size);
	}

delete与delete[]

平时使用delete是   delete   指针变量;

由此我们猜测   入参是一个指针,没有出参;

 

也就是

void operator delete(void *p);

看到自定义的也有这种写法;

那么结构就呼之欲出了

	void operator delete(void * p)
	{
		cout << "重载了delete操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

	void operator delete[](void *p)
	{
		cout << "重载了delete[]操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

 

 

验证:

验证代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;

class A
{
public:
	A()
	{
		cout << "A()..." << endl;
	}
	A(int a) {
		cout << "A(int)..." << endl;
		this->a = a;
	}

	//重载的new操作符 依然会触发对象的构造函数
	void * operator new(size_t size)
	{
		cout << "重载了new操作符" << endl;
		return malloc(size);
	}

	void *operator new[](size_t size)
	{
		cout << "重载了new[]操作符" << endl;
		return malloc(size);
	}
	void operator delete(void * p)
	{
		cout << "重载了delete操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

	void operator delete[](void *p)
	{
		cout << "重载了delete[]操作符" << endl;
		if (p != NULL) {
			free(p);
			p = NULL;
		}
	}

	~A() {
		cout << "~A().... " << endl;
	}

private:
	int a;
};

int main(void)
{

	A *array_p = new A[10];

	delete[] array_p;

	A *ap = new A(10);

	delete ap;
	
	return 0;
}

运行结果

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值