最近遇到一个莫名的问题,在HP-UX B.11.31 U ia64平台下,程序PetriService在接收到产品化退出或Ctrl-C时,程序在main函数返回后析构全局的CTQueue<SMsgEntry*>(继承自标准库list) 时程序core掉。
初步考虑主线程退出时,其他线程还在使用此全局变量所致。但在程序返回退出前,停掉其他线程,仍在main返回后析构时挂掉。于是将所有相当代码行注释掉,发现只要此入CTQueue就会挂掉,gdb调试,及在查看标准库list文件及CTQueue.h实现后,未发现问题。
将CTQueue<SMsgEntry*>改成CTQueue<int>,发现程序依然core在CTQueue<SMsgEntry*>当中。
此时想起别外一个实现文件中也有一个类似的变量声明,但此文件被其他程序所用,而非当前的PetriService程序。此时,才想到由于变量声明冲突(在PetriService.cpp、CDCPetriTransition.cpp同时分别声明了相同的CTQueue<SMsgEntry*> g_msgQueue,没有加static关键字,分别为两个程序所用)导致析构时core。在将变量改名后,core问题消失。