EffctiveC++.9

来源:互联网 发布:网络电视的小遥控机 编辑:程序博客网 时间:2024/04/28 08:55
/*避免隐藏标准的operate new*/
#include 
<iostream>
using namespace std;

class X
{
public:
    
void f()
    
{
        cout
<<sizeof(*this)<<"  "<<sizeof(X)<<endl;
    }
;
    
static void *operator new(size_t size)
    
{
        
return ::operator new(size);
    }

    
static void *operator new(size_t size,new_handler p);
}
;
void *X::operator new(size_t size,new_handler p)
{
    
if(0==size) size=3;
    set_new_handler(p);
    
return ::operator new(size);
}

void SpecialErrorHandler()
{
    cerr
<<"error in alloc memory";
    exit(
1);
}

void main()
{
    X 
*px1=new(SpecialErrorHandler)X;
    X 
*px2=new X;
    px1
->f();
    px2
->f();
    cout
<<sizeof(X)<<endl;
    cout
<<sizeof(px1)<<endl;
    delete px1;
    delete px2;
    system(
"pause");
}

另外附注一个set_new_handler 的例子

 

// new_set_new_handler.cpp
// compile with: /EHsc
#include<new>
#include
<iostream>

using namespace std;
void __cdecl newhandler( )
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
//__cdecl程序的压栈方式为C风格                
//__stdcall为PASCAL风格             
//举个例子:            
//(1)   C函数  Fun1(a,b,c)                
//  函数调用时,参数压栈顺序为 c , b , a            
//(2)   PASCAL函数 Fun(a,b,c)                 
// 函数调用时,参数压栈顺序为 a, b , c
*/

{
    cout 
<< "The new_handler is called:" << endl;
    
throw bad_alloc( );
    
return;
}


void main( ) 
{
    set_new_handler (newhandler);
    
try
    
{
        
while ( 1 ) 
        
{
            
new int[50000000];
            cout 
<< "Allocating 5000000ints." << endl;
        }

    }

    
catch ( exception e )
    
{
        cout 
<< e.what( ) << " xxx" << endl;
    }

}

在vc6运行总会error,在vs2005 比较好,通过这个代码能够比较默认new与自定义new差别,尤其在自定义operator new后需要重定义下默认的new以免默认的不能使用

原创粉丝点击