重点:
1.重载了new,就必须重载对应的delete
其中new返回类型为void*,重载需要new和new[]
其中delete输入参数类型为void*,重载需要delete和delete[]
1.重载new的格式:void* operator new(size_t sz)
void* operator new[](size_t sz)
1.重载delete的格式:void operator delete(void* m)
void operator delete[](void* m)
重载全局new和delete
//重载全局new
void* operator new(size_t sz)
{
cout << "new size of:" << sz << endl;
void* m = malloc(sz);
if (!m)
{
cout << "out of memory" << endl;
}
return m;
}
//重载全局new[]
void* operator new[](size_t sz)
{
cout << "new[] size of:" << sz << endl;
void* m = malloc(sz);
if (!m)
{
cout << "out of memory" << endl;
}
return m;
}
//重载全局delete
void operator delete(void* m)
{
cout << "delete"<< endl;
free(m);
}
//重载全局delete[]
void operator delete[](void* m)
{
cout << "delete[]" << endl;
free(m);
}
int main()
{
int* a = new int;
int* b = new int[10];
delete a;
delete[] b;
return 0;
}
重载类的new和delete
class MyClass
{
public:
MyClass() = default;
~MyClass() = default;
void* operator new(size_t sz) //重载new
{
cout << "new size of" << sz << endl;
return new char[sz];
}
void* operator new[](size_t sz) //重载new[]
{
cout << "new[] size of" << sz << endl;
return new char[sz];
}
void operator delete(void* m) //重载delete
{
cout << "delete" << endl;
delete m;
}
void operator delete[](void* m) //重载delete[]
{
cout << "delete[]" << endl;
delete[] m;
}
private:
int num[3];
};
int main()
{
MyClass* mclass = new MyClass;
cout << "size of" << sizeof(*mclass) << endl;
delete mclass;
MyClass* mgroup = new MyClass[2];
cout << "size of" << sizeof(*mgroup) << endl;
delete[] mgroup;
return 0;
}