::operator new/::operator delete的重载

本文介绍了如何在C++中重载全局::operatornew和::operatordelete,并强调了它们的全命名空间作用范围及重载时需谨慎。通过实例展示了new[]和delete[]的处理方式,以及可能带来的全局影响。
摘要由CSDN通过智能技术生成

::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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值