删除类成员映射时,映射析构函数stl_map.h崩溃
Getting a crash in map destructor stl_map.h while deleting class member map
我有一个类,它有映射成员变量,在类析构函数中,我将删除通过调用包装函数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实例的内存在其他地方被破坏了。
相关文章:
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 类中的 C++ 全局映射,不要打印 map 元素
- 如何将不同的函数签名映射到同一个 std::map?
- 我尝试使用MAP容器来映射资源,现在RESOURCEFILE正在获取所有信息.为什么
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- std::map 擦除 - 将迭代器传递给错误的映射
- 线程安全 std::map:锁定整个映射和单个值
- 如何在C++中迭代集合映射(std::map<std::set< char>, int >)?
- 这些会做什么(映射[x] [y] = 2;,map [x] [y] = 3;,以及map [x] [y] = 4;在下面
- 将 JNI -> jobject(基本上是 java 文件中的映射和/或映射的映射)转换为 std::map(c++)
- 为什么要对 map::find 应用不存在的键将返回一个C++中第一个值映射大小的迭代器
- 如何在std :: Map中找到std :: set中的映射中的最小/最大值
- 映射/设置迭代器在 std::map 中不可递增
- map/set迭代器不可递增,我无法从头开始重新启动映射
- 如何在 std::map 中使用 emplace(),其值为 std::set(从某物映射到集合)
- 如何使用boost::mutex作为std::map中的映射类型
- 值类型为std::map的C++std::映射
- 通过引用将 std::map 传递给不更新映射的类的构造函数
- 正确初始化指针映射 - map<p*, p*>