::operator new/::operator delete是可以重载的。new delete是不可以重载的。他们的作用范围都是全命名空间,需要小心重载
//----------------------------------------------------
#include <cstdlib> //malloc, free
#include <iostream>
#include <complex>
using namespace std;
void* myAlloc(size_t size)
{ return malloc(size); }
void myFree(void* ptr)
{ return free(ptr); }
//小心,這影響無遠弗屆
inline void* operator new(size_t size) {
cout << "jjhou global new(), \t" << size << "\t"<<endl;
return myAlloc( size );
}
inline void* operator new[](size_t size) {
cout << "jjhou global new[](), \t" << size << "\t"<<endl;
void* p = myAlloc( size );
cout << "p=" << p << endl;
return p;
//return myAlloc( size );
}
//(1)
inline void operator delete(void* ptr, size_t size) {
cout << "jjhou global delete(ptr,size), \t" << ptr << "\t" << size << endl;
myFree( ptr );
}
//(2)
inline void operator delete(void* ptr) {
cout << "jjhou global delete(ptr), \t" << ptr << endl;
myFree( ptr );
}
//(1)
inline void operator delete[](void* ptr, size_t size) {
cout << "jjhou global delete[](ptr,size), \t" << ptr << "\t" << size << endl;
myFree( ptr );
}
//(2)
inline void operator delete[](void* ptr) {
cout << "jjhou global delete[](ptr), \t" << ptr << endl;
myFree( ptr );
}
int main()
{
void* p0 = malloc(512); //512 bytes
free(p0);
complex<int>* p1 = new complex<int>; //one object
delete p1;
complex<int>* p2 = new complex<int>[3]; //one object
delete[] p2;
void* p3 = ::operator new(512); //512 bytes
::operator delete(p3);
}
jjhou global new(), 8
jjhou global delete(ptr,size), 0x691770 8
jjhou global new[](), 24
p=0x691770
jjhou global delete[](ptr), 0x691770
jjhou global new(), 512
jjhou global delete(ptr), 0x691ae0