2012-03-21 115 views
1

我有一个具有映射成员变量和类析构函数的类我通过调用包装函数reset()来删除 映射成员,如下面的代码所示删除类成员映射时在地图析构函数stl_map.h中崩溃

void zreg::reset() 
83 { 
84  s_err = ""; 
85  bad_types = 0; 
86  bad_apis = 0; 
87  b_valid = false; 
88 
89  zt_itr_t it; 
90  while ((it = m_types.begin()) != m_types.end()) { 
91  delete it->second; 
92  m_types.erase(it); 
93  } 
94 
95  zf_itr_t itf; 
96  while ((itf = m_apis.begin()) != m_apis.end()) { 
97  delete itf->second; 
98  m_apis.erase(itf); 
99  } 
100 } 

36 zreg::~zreg() 
37 { 
38  reset(); 
39 } 



class zreg 
210 { 
211 public: 
212  // Construction/destruction 
213  zreg(); 
214  ~zreg(); 
215 
216  typedef std::map<std::string, z_type_info *> zt_map_t; 
217  typedef std::map<std::string, z_type_info *>::iterator zt_itr_t; 
218  typedef std::map<std::string, z_type_info *>::const_iterator zt_citr_t; 
219  typedef std::map<std::string, z_type_function *> zf_map_t; 
220  typedef std::map<std::string, z_type_function *>::iterator zf_itr_t; 
221  typedef std::map<std::string, z_type_function *>::const_iterator zf_citr_t; 
222 

255 private: 
256  size_t bad_types; 
257  size_t bad_apis; 
258  std::string s_err; 
259  std::string s_version; 
260  bool b_valid; 
261 
262  zt_map_t m_types; 
263  zf_map_t m_apis; 

在上述z_type_info和z_type_function是一类

堆栈跟踪: #0的std ::地图,性病::分配器>,z_type_function *,性病::以下,标准::分配器>> ,std :: allocator,std :: allocator> const,z_type_function *> >>> ::〜map(this = 0x8006da400,__in_chrg =) a吨/x/freebsd/x86_64/stdhdrs_cplus/bits/stl_map.h:94 #1 0x0000000804ea34c2在zreg ::〜zreg(这= 0x805158ac0,__in_chrg =)

如从BT调用的最后一个函数是可见〜 zreg析构函数,但为什么bt没有显示调用reset()函数的调用。

其次,如何重现此崩溃,因为我无法再重现它。可能如果我把我的课程zreg的代码放出来,如果它会重现这个问题?

+0

问题是我没有做它的迭代器,它在删除成员的同时增加了复位功能。并可能会失去一些空检查? – Omprakash 2012-03-22 04:40:04

回答

0

我认为崩溃发生在重置()后,在〜map() 这可能是如果你的zreg实例的内存在其他地方被破坏。

+0

但是在gdb的backtrace(bt)中,在调用〜zreg析构函数后,调用reset()函数不会显示。 – Omprakash 2012-03-22 05:06:28