a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

for循環中刪除map中的元素valgrind檢測提示error:Invalid read of size 8

2020-01-26 14:31:12
字體:
來源:轉載
供稿:網友

廢話不多說,先看下面一段代碼

#include <iostream>#include <map>using namespace std;class A{public:typedef std::map<int, string> myMap;void mapInsert(int i, string s){map.insert(std::make_pair(i, s));}void deleteMap(){for (myMap::iterator it = map.begin(); it != map.end(); ++it){map.erase(it->first);}}private:myMap map;};int main(){A a;a.mapInsert(1, "1");a.mapInsert(2, "2");a.mapInsert(3, "3");a.mapInsert(4, "4");a.mapInsert(5, "5");a.deleteMap();return 0;}

上述代碼編譯運行皆沒有問題,但是用valgrind檢測會提示錯誤:

valgrind --tool=memcheck --leak-check=full --track-origins=yes ./test # ~/test==723953== Memcheck, a memory error detector==723953== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.==723953== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info==723953== Command: ./test==723953== ==723953== Invalid read of size 8==723953== at 0x3431C69E60: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (tree.cc:60)==723953== by 0x40131C: std::_Rb_tree_iterator<std::pair<int const, std::string> >::operator++() (in /home/thm/test/test)==723953== by 0x40117C: A::deleteMap() (in /home/thm/test/test)==723953== by 0x400F4B: main (in /home/thm/test/test)==723953== Address 0x4c580b8 is 24 bytes inside a block of size 48 free'd==723953== at 0x4A06016: operator delete(void*) (vg_replace_malloc.c:480)==723953== by 0x401E23: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, std::string> > >::deallocate(std::_Rb_tree_node<std::pair<int const, std::string> >*, unsigned long) (in /home/thm/test/test)==723953== by 0x401C99: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::_M_put_node(std::_Rb_tree_node<std::pair<int const, std::string> >*) (in /home/thm/test/test)==723953== by 0x401AA6: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<int const, std::string> >*) (in /home/thm/test/test)==723953== by 0x401729: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<int const, std::string> >) (in /home/thm/test/test)==723953== by 0x40134C: std::map<int, std::string, std::less<int>, std::allocator<std::pair<int const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<int const, std::string> >) (in /home/thm/test/test)==723953== by 0x401170: A::deleteMap() (in /home/thm/test/test)==723953== by 0x400F4B: main (in /home/thm/test/test)==723953== ==723953== Invalid read of size 8==723953== at 0x3431C69E80: std::_Rb_tree_increment(std::_Rb_tree_node_base*) (tree.cc:68)==723953== by 0x40131C: std::_Rb_tree_iterator<std::pair<int const, std::string> >::operator++() (in /home/thm/test/test)==723953== by 0x40117C: A::deleteMap() (in /home/thm/test/test)==723953== by 0x400F4B: main (in /home/thm/test/test)==723953== Address 0x4c580a8 is 8 bytes inside a block of size 48 free'd==723953== at 0x4A06016: operator delete(void*) (vg_replace_malloc.c:480)==723953== by 0x401E23: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<int const, std::string> > >::deallocate(std::_Rb_tree_node<std::pair<int const, std::string> >*, unsigned long) (in /home/thm/test/test)==723953== by 0x401C99: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::_M_put_node(std::_Rb_tree_node<std::pair<int const, std::string> >*) (in /home/thm/test/test)==723953== by 0x401AA6: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<int const, std::string> >*) (in /home/thm/test/test)==723953== by 0x401729: std::_Rb_tree<int, std::pair<int const, std::string>, std::_Select1st<std::pair<int const, std::string> >, std::less<int>, std::allocator<std::pair<int const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<int const, std::string> >) (in /home/thm/test/test)==723953== by 0x40134C: std::map<int, std::string, std::less<int>, std::allocator<std::pair<int const, std::string> > >::erase(std::_Rb_tree_iterator<std::pair<int const, std::string> >) (in /home/thm/test/test)==723953== by 0x401170: A::deleteMap() (in /home/thm/test/test)==723953== by 0x400F4B: main (in /home/thm/test/test)==723953== ==723953== ==723953== HEAP SUMMARY:==723953== in use at exit: 0 bytes in 0 blocks==723953== total heap usage: 10 allocs, 10 frees, 370 bytes allocated==723953== ==723953== All heap blocks were freed -- no leaks are possible==723953== ==723953== For counts of detected and suppressed errors, rerun with: -v==723953== ERROR SUMMARY: 8 errors from 2 contexts (suppressed: 6 from 6)

Why?

此代碼可以實現功能要求,但是健壯性并不好,假設在map.erase之后再次使用map當前的iterator,即

void deleteMap(){for (myMap::iterator it = map.begin(); it != map.end(); ++it){map.erase(it->first);std::cout << "map.first=" << it->first << " map.second=" << it->second << std::endl;}}

代碼運行就會出現錯誤,因為it目前指向的對象已經被刪掉了。

為了避免程序出現這樣的錯誤,我們應該保證在iterator指向的對象被刪掉之前,iterator已經向前移位一。

程序改成如下即可:

void deleteMap(){for (myMap::iterator it = map.begin(); it != map.end();){map.erase(it++->first);}} 


void deleteMap(){for (myMap::iterator it = map.begin(); it != map.end();){int i = it->first;++it;map.erase(i);}}

以上所述是小編給大家介紹的for循環中刪除map中的元素valgrind檢測提示error:Invalid read of size 8 ,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 久久福利 | 午夜社区 | 国产成人+综合亚洲+天堂 | 在线亚洲一区二区 | 中文字幕在线观看精品视频 | 亚洲成年片 | 激情久久久 | 成人福利av | 亚洲午夜精品一区二区三区他趣 | 中文字幕亚洲一区二区va在线 | 成人黄色在线 | 国产成人精品久久二区二区 | 欧美一级成人欧美性视频播放 | 成人黄色在线 | 亚洲一级毛片 | 日本高清视频网站www | 黄色日本视频 | 中文日韩在线 | 亚洲视频一区二区三区 | av网址在线播放 | 伊人激情网 | 日韩精品一区二区三区免费视频 | 天天摸夜夜摸爽爽狠狠婷婷97 | 免费成人高清 | 成人男女激情免费视频 | 日韩av在线一区 | 亚洲美女视频在线观看 | 国产乱码精品一区二区三区av | 美日韩一区二区 | 亚洲精品v| 欧美视频在线观看免费 | www色婷婷 | 欧美成人二区 | 黄色一级大片在线免费看产 | 日韩欧美国产成人一区二区 | 欧美亚洲一区 | 99久久婷婷国产综合亚洲 | 亚洲成人激情在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 黄色日本视频 | 色视频网站免费看 |