赞
踩
重载::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 }
重写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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。