【问题标题】:Getting a crash in map destructor stl_map.h while deleting class member map删除类成员映射时在映射析构函数 stl_map.h 中崩溃
【发布时间】:2012-04-06 03:23:01
【问题描述】:

我有一个具有映射成员变量的类,在类析构函数中我正在删除 通过调用包装函数 reset() 来映射成员,如下代码所示

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::map, std::allocator >, z_type_function*, std::less, std::allocator > >, std::allocator, std::allocator > const, z_type_function*> >::~map (这=0x8006da400,__in_chrg=) 在 /x/freebsd/x86_64/stdhdrs_cplus/bits/stl_map.h:94 #1 0x0000000804ea34c2 in zreg::~zreg (this=0x805158ac0, __in_chrg=)

从 bt 可以看出,最后调用的函数是 ~zreg 析构函数,但为什么 bt 没有显示调用 reset() 函数。

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

【问题讨论】:

  • 问题是我在删除成员时没有在重置函数中执行迭代器 it 和 itf 增量。并且可能缺少一些空检查?

标签: c++ dictionary crash destructor delete-operator


【解决方案1】:

我认为在 ~map() 中重置()后发生了崩溃 可能是您的 zreg 实例的内存在其他地方损坏了。

【讨论】:

  • 但是在 gdb 的 backtrace(bt) 中,调用了 ~zreg 析构函数后没有显示对 reset() 函数的调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2018-07-08
  • 2019-12-12
  • 2020-05-16
  • 2021-07-12
相关资源
最近更新 更多