删除类成员映射时,映射析构函数stl_map.h崩溃

Getting a crash in map destructor stl_map.h while deleting class member map

本文关键字:映射 map 崩溃 stl 成员 删除 析构函数      更新时间:2023-10-16

我有一个类,它有映射成员变量,在类析构函数中,我将删除通过调用包装函数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::allocater>,z_type_function*,std::less,std::allocater>>,std:;allocater,std:,allocater>const,z_ttype_function*>>::~map(this=0x806da400,__in_chrg=)位于/x/freebsd/x86_64/stdhdrs_cplus/bits/stl_map.h:94#zreg中的1 0x0000000804ea34c2::~zreg(this=0x805158ac0,__in_chrg=)

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

第二,如何再现这次崩溃,因为我无法再次再现。如果我把类zreg的代码取出来,它应该会重现这个问题吗?

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