今天来一个问题单上面标着致命,对于一个菜鸟程序而言真是吓一跳,以为是运行时core造成测试无法继续。看了详细情况后才知是昨天已经处理的core问题,在系统退出的时候core了。
最近优化一个东西,由于是菜鸟,所以采用成熟模块的架构,模仿着写。
写了一个管理类manager,在此管理类中初使化所有数据。然后写一个公共接口类managerImp继承自公共模块的一个接口类BaseImp。然后把所以管理类中初使化的相关数据全部注册到managerImp中去。此时我就在析构managerImp中去调用各个管理类的相关释放函数。然而意外的是BaseImp中把注册进来的句柄也都全部释放了一次,因而造成了重复释放。
就按现在编程规范来说,谁申请就由谁来释放,尤其是对于这种实例会被多处管理器所引用地方,指针的释放要特别小心。此处架构一开始就用单例把相同实例管理在一起,然后用加锁的形式判断是否已析构,完全可以把这些资源放在这样的管理类中统一去释放,其他注册了此实例的类不去理会其构造与释放(因为这里实例是稳定的,同时其他注册类也能保证比此类先释放)。
开始core了之后就把堆栈信息发过来,由于代码写的时候注意下,而开始也没有把资源释放写进去,而由系统自己去回收,后来补上了,没有仔细推敲,转测之后才有这问题。这说明以后在有疑问的地方还是细心推敲。
走完问题单后下班路上想想,对于一个GDB都还是太会的菜鸟程序员,如果不是此处代码是自己已经熟识,能这么快清楚知道是重复释放的问题吗?但后来想了想,在堆栈信息是调用析构函数的时候core的,在这种情况也应该大多只能是重复释放了,如果是其他内存问题就应该在运行的时候core了。此次并不严重问题(测试好像不那么认为,不然也不会写个致命吓我了)让我又多的思考了一下下。