VC++ 6.0是目前我最喜欢的编译器之一。已有六年的使用历史,本以为已经相当熟悉了,可今天让我,之前不知道写了多少的new,delete都没有问题,同样的电脑,同样的操作系统,还是以前的VC6.0开发环境,今晚却让我苦逼了一晚上。 情景:有两个线程,一个线程用来读取文件(new 内存块),另一个线程用来处理读取的文件内容(有delete 内存块)。首先,删除的每一个内存块都是线程1合法new的,没有重复删除情况。单步跟踪正常,打日志跟踪正常,但是程序全速跑一段时间,立刻报内存块不能为读,或是不能为写,或是删除的内存地址不合法,甚是怪异。 开始时,根本不怀疑是 new /delete引起的问题,还以为其它哪个地方有问题呢,因为在学生时代都在书本上见过,而且在一起论坛上也有见过说 new/delete是线程安全的,而且自己用了这多年也从没遇到过什么问题,所以根本不怀疑。但是经过近两个小时的排查之后,终于让我确信是new/delete的问题,在重载了new/delete(线程安全版本)之后 ,程序跑起来了,经过反复测试一点错也没有,再换回之前代码,又是报错,oK,问题锁定了,解决了。 疑问,为什么我之前在多线程环境下的new/delete就没有问题呢,而今天这么不过200行的代码却是问题不断 ?!但直觉告诉我,这绝非偶然!!唉,时间不早了,待以后研究吧