这几个bug的最终解决方案都很简单,代码也很少;但是找到问题根源的时间却不少。
一个是指针在delete之后没有设置成null;另一个是manage c++中,没有delete unmanaged resource。
第一个bug是关于一个包含很多不同类型Element指针的list。创建list内容时,如果Element指针ptr不是null,new一个;在一个循环结束之后,会清空list(delete所有element)并创建新的list的内容。问题是delete之后不设置为null,就不会调用到new,因为ptr还指向一个被delete掉的内存。
第二个是unmanaged resouce中有db connection,在try中gcnew出来之后没有在finally中delete之。之后跑多用户的test中,.net架构中finalizer起一个单独的线程来调用对应析构函数;这样就把db connection占用了。不幸的是,我们的app架构限定一个用户只有一个;这个时候app中使用db connection时就会抛出一个exception(SQL服务器忙)。
之前有同事在处理同一个问题,注意到了这个exception却被误导了:一直在找可以使用多个connection的方案,却没有考虑是谁在长时间占用这个连接。被表现所迷惑...
以上2个例子都可以做pattern以防止以后出现类似的问题。
--------------------------------------------
2011/3/18 补充
最近碰到一个c++ bug,就是有个queue会崩溃。
后来发现是C++的一个structure,添加了一个成员,size增加了;但是queue里面有很多老的structure数据。一碰到这种old数据,新的code就蹦了。又见脏数据。。。