總結:
//重載的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;
}
運行結果