# 什么时候要重写new
这里要注意编译器是如何解释new这个关键字的,只有理解了才能知道怎么重写new。当编译器看到`t* = new t();` 的时候,编译器做了如下几个动作
+ 调用 `new(sizeof(t))`来分配内存
+调用t的构造函数,实例化的数据会填充在分配的内存上。然后返回指向这个实例化的指针。
+如果中间发生异常,会调用相应的delete,释放掉内存。
所以虽然只是简单的new, 编译器看到后转换的代码不少。
这里如果我们要干预这个过程,可以通过重载new(sizeof(t))和对应的delete来干预。只要重载`void* operator new(std::size_t size) throw(std::bad_alloc)`就可以达到干预的目的。
# 一个重载new的实例
```
void* operator new(std::size_t size) throw(std::bad_alloc) // new的原型
{
size_t realSize = size+2*sizeof(int);
void *pMem = malloc(realSize);
if(!pMem) throw bad_alloc();
*(static_cast<int*>(pMem)) = signature;
*(reinterpret_cast<int*>(staic_cast<Byte*>(pMeme)+realSize-sizeof(int))) = signature;
return static_cast<unsigned char*>(pMem)+sizeof(int);
}
```
这样实现的new重载,有两个问题,问题1是没有按惯例设计new,问题2是没有办法保证字节对齐。
所以重载一个完备的new是要注意很多方面的,非必要不要自己重载。
如果要重载,要考虑item51的说明
网友评论