总结:
//重载的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;
}
运行结果