Получение сбоя в деструкторе карты stl_map.h при удалении карты члена класса - PullRequest
1 голос
/ 21 марта 2012

У меня есть класс, который имеет переменную члена карты, и в деструкторе класса я удаляю отобразить член, вызвав функцию-обертку reset (), как показано ниже code

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 ( this = 0x8006da400, __in_chrg =) на /x/freebsd/x86_64/stdhdrs_cplus/bits/stl_map.h:94 # 1 0x0000000804ea34c2 в zreg :: ~ zreg (this = 0x805158ac0, __in_chrg =)

Как видно из bt, последняя вызванная функция является деструктором ~ zreg, но почему bt не показывает вызов функции reset (), вызываемой.

во-вторых, как воспроизвести этот сбой, поскольку я не могу воспроизвести его снова. вероятно, если я возьму код моего класса zreg, это должно воспроизвести проблему?

1 Ответ

0 голосов
/ 21 марта 2012

Я думаю, что сбой произошел после сброса (), в ~ map () Это может быть, если память о вашем экземпляре zreg была повреждена в другом месте.

...