前面我们实现的这个内存池使用起来,可能会遇到不少问题。比如,某同学申请内存的时候,用的是
whatever *p = new whatever;
或者其他的,而不是
whatever *p = new(__LINE__, FILE_NAME) whatever;
结果这块内存仍旧走的是系统,但是释放的时候却调用的内存池的释放函数,这就是崩的节奏啊。还有,像微软MFC里的AfxMem.cpp和AfxMem.h里也有new和delete的placement,会不会冲突?打开看看,有一大堆。还好还好,我们的new还是有区别的,行号在文件名的前面,是第二个参数。微软的是反过来的。
太不保险了吧!别人如果也overload了相同参数的new,编译都会通不过。而且你又怎么能保证别人的new会走到你的内存池里?还是别霸占delete了,给人给己留条活路吧!
所以我们还是得改一下,不要overload delete函数。让我们定义三个宏
#define NEW new(__LINE__, FILE_NAME)
#define DEL_PTR(p) { DestructP