零、上期彩蛋:不要重载全局new
或许,是一次很不愉快的经历,所以在会有这么一个“认识”。反正,大概就是:即使你足够聪明,也不要自作聪明;在这就是不要重载全局new,无论你有着怎样的目的和智商。因为:
class XXX{public:
XXX* createInstance();
};这是一个不对称的接口:只告诉了我们如何创建一个【堆】对象,但是释放呢??! 很无奈,只能假设其使用全局默认的delete来删除(除此之外,没有其他选择);这时,我为了某些目的,重载了全局delete(或许是为了监视、为了优化、为了...):
void operator delete(void* addr)
{
... //一些事情发生了 ...
std::free(addr);
}这是一种很自然的做法;但是,但是会崩的,在未来或现在的某日;其名为:堆错误。也就是崩在了堆上,原因也很简单:代码中有谁并不是使用std::malloc来分配内存的——比如说前面的那个【XXX】,我们谁也不知道它是分配在那个堆上面的:是默认的系统堆,还是VS-debug中的调试堆(此为坑点)。


