1. 重写全局new/delete
重载::operator new、::operator delete、::operator new[]、operator delete[]
注意:如果重载的是全局的,所以创建对象时编译器调用operator new、operator delete时都会去调用自己重载的版本;如果重载的类成员operator new,那么只在创建和释放该类对象时编译器调用自己重载的operator new、operator delete版本。
如果Fraction类没有重写本来的new/delete,那么会直接调用全局的new/delete:
class Fraction
{
public:
Fraction(int num, int den = 1) :m_numerator(num), m_denominator(den) {}
private:
int m_numerator;//分子
int m_denominator;//分母
};
void* myAlloc(size_t size)
{
return malloc(size);
}
inline void* operator new(size_t size)
{
cout << "调用了重载的全局new\n" << endl;
return myAlloc(size);
}
void operator delete(void* ptr /*,size_t*/)//第二个参数有默认值,不写也没有影响
{
cout << "调用了重载的全局delete\n" << endl;
free(ptr);
}
int main()
{
Fraction* f = new Fraction(1);//调用了重载的全局new
delete f;//调用了重载的全局delete
}
2. 重写成员new/delete
重写new和new[]区别就是new只会调用一次构造函数,而new[]会调用多次(次数就是[]内数字)。
class Foo
{
public:
int m_id;
long m_data;
string m_str;
public:
Foo() :m_id(0) { cout << "无参构造函数调用" << endl; }
Foo(int i) :m_id(i) { cout << "有参构造函数调用" << endl; }
~Foo() { cout << "析构函数调用" << endl; }
static void* operator new(size_t size)
{
cout << "opera