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");
}
#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;
}
}
// 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以免默认的不能使用
- EffctiveC++.9
- EffctiveC++.2
- EffctiveC笔记
- EffctiveC++.10 用list创建内存池
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- 9
- .9
- 愛鯢 σκ难
- 得到两个日期得间隔数,VB中的DateDiff ,我自己写了一个C#的
- 在Delphi中使用复杂的SQL
- SAP实施过程中关键用户应发挥的作用
- WebPlayer9首创 "实时视频内嵌交互式广告"
- EffctiveC++.9
- Application
- 访问者模式
- tomcat 6.0 连接池配置使用
- start
- Session
- Session
- 【转】内核级Rootkit技术入门(一)
- 抨击世俗:男人难,难在欲望无法去除