マップメンバー変数とクラスデストラクタを持つクラスがあります。以下のコードに示すように、ラッパー関数reset()を呼び出して マップメンバーを削除します。上記z_type_infoとz_type_functionにおいてクラスメンバーマップを削除中にマップデストラクタ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;
クラス
スタックトレースである: #0のstd ::マップ、スタンダード::アロケータ>、z_type_function *、STD ::以下、スタンダード::アロケータ>> 、std :: allocator、std :: allocator> const、z_type_function *>>> ::〜map(this = 0x8006da400、__in_chrg =) aトンZREGで/x/freebsd/x86_64/stdhdrs_cplus/bits/stl_map.h:94 #1 0x0000000804ea34c2 ::〜ZREG(これ= 0x805158ac0、__in_chrg =)
と呼ばれる最後の関数であることがBTから分かるように〜 zregデストラクタを使用していますが、なぜbtが呼び出されているreset()関数への呼び出しを表示していないのですか?
第2回このクラッシュを再現する方法を再現できません。おそらく私のクラスのコードをzregから取り除くと問題が再現されるでしょうか?
問題は、メンバーを削除するときにiterator itおよびitf incrementをリセット機能で実行していないことです。ヌルチェックが行方不明になることがありますか? – Omprakash