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

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章