标签:
Item 50: Understand when it makes sense to replace new and delete.
我们在Item 49中介绍了如何自定义new的错误处理函数,以及如何为你的类重载operator new。 现在我们回到更基础的问题,为什么我们需要自定义operator new或operator delete?
new
operator new
operator delete
delete
自定义一个operator new很容易的,比如实现一个支持越界检查的new:
static const int signature = 0xDEADBEEF; // 边界符 typedef unsigned char Byte; void* operator new(std::size_t size) throw(std::bad_alloc) { // 多申请一些内存来存放占位符 size_t realSize = size + 2 * sizeof(int); // 申请内存 void *pMem = malloc(realSize); if (!pMem) throw bad_alloc(); // 写入边界符 *(reinterpret_cast<int*>(static_cast<Byte*>(pMem)+realSize-sizeof(int))) = *(static_cast<int*>(pMem)) = signature; // 返回真正的内存区域 return static_cast<Byte*>(pMem) + sizeof(int); }
其实上述代码是有一些瑕疵的:
double
int
malloc
到此为止你已经看到了,实现一个operator new很容易,但实现一个好的operator new却很难。其实我们还有别的选择:比如去读编译器文档、内存管理的商业工具、开源内存管理工具等。
本文地址:http://harttle.com/2015/09/19/effective-cpp-50.html
Item 50:为什么需要自定义new和delete?
原文地址:http://blog.csdn.net/yangjvn/article/details/50705966