零、上期彩蛋:不要重载全局new

  或许,是一次很不愉快的经历,所以在会有这么一个“认识”。反正,大概就是:即使你足够聪明,也不要自作聪明;在这就是不要重载全局new,无论你有着怎样的目的和智商。因为:

class XXX{public:
    XXX* createInstance();
};

  这是一个不对称的接口:只告诉了我们如何创建一个【堆】对象,但是释放呢??!  很无奈,只能假设其使用全局默认的delete来删除(除此之外,没有其他选择);这时,我为了某些目的,重载了全局delete(或许是为了监视、为了优化、为了...):

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

void operator delete(void* addr)
{
    ...    //一些事情发生了    ...
    std::free(addr);
}

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

  这是一种很自然的做法;但是,但是会崩的,在未来或现在的某日;其名为:堆错误。也就是崩在了堆上,原因也很简单:代码中有谁并不是使用std::malloc来分配内存的——比如说前面的那个【XXX】,我们谁也不知道它是分配在那个堆上面的:是默认的系统堆,还是VS-debug中的调试堆(此为坑点)。

网友评论