http://blog.csdn.net/zhenjing/archive/2009/07/16/4354880.aspx
Operator
new
的全局重载
我们经常看到这么一句话:
operator new
可以重载,
placement new
不可重载。其实此处所说的不可重载应该是指全局的
placement new
不可重载,对于类域中的
placement new
是可以重载的,而且只要重载了任何一种形式的
operator new
都应该顺便重载
placement new
, 即
void * operator new(std::size_t
count, void *ptr)
。
操作符重载一般用于特定类型,名字解析过程同一般的函数重载。
Operator new
由于其特殊性,编译器提供了默认提供
6
种全局重载形式,同时还允许用户提供自定义的全局
operator new
,其参数甚至可以和全局版本一样,除全局
placement new
外。对于类域,任何形式的
new
都是可以重载的,包括
placement
new
形式。
全局的
operator new(
函数
)
有六种重载形式
void
*operator
new(std::size_t count)
throw(std::bad_alloc);
//
一般的版本
void
*operator
new(std::size_t count,
//
兼容早版本的
new
const std::nothrow_t&) throw();
//
内存分配失败不会抛出异常
void
*operator
new(std::size_t count, void *ptr) throw();
//placement
版本
void
*operator
new[](std::size_t count)
//
throw(std::bad_alloc);
void
*operator
new[](std::size_t count,
//
const std::nothrow_t&) throw();
void
*operator
new[](std::size_t count, void *ptr) throw();
重载
operator new
规则
重载
operator new
的参数个数是可以任意的
,
只需要保证第一个参数为
size_t,
返回类型为
void *
即可
,
而且其重载的参数类型也不必包含自定义类型
.
更一般的说
, operator
new
的重载更像是一个函数的重载
,
而不是一个操作符的重载
.
如:
全局重载示例:
void*
operator
new(size_t size)
//
重载成功
{
printf("global new\n");
return malloc(size);
//return ::operator new(size);
//
递归调用提示
(warning)
}
//void
*operator
new(std::size_t size, void *ptr) //
无法重载
//{
//
printf("global new\n");
//
return ::operator new(size,ptr);
//}
void
* operator
new(size_t size, const std::nothrow_t& e) //
重载成功
,
递归调用提示
(warning)
{
printf("global new\n");
return ::operator new(size, e);
}
一般形式的
operator new
重载示例:
void
* operator
new(size_t size, int x, int y, int z)
{
...
}
X *
pX = new (1,
2, 3) X;
char
data[1000][sizeof(foo)];
inline
void*
operator new(size_t size, int n)
{
return data[n];
}
就可以使用这样有趣的语法来创建对象
:
foo
*p=new(6)
foo(); //
把对象创建在
data
的第六个单元上