STL中的map调用erase(it),当value值为指针时,释放内存:
1 #include <iostream> 2 #include <map> 3 #include <string> 4 5 using namespace std; 6 struct value{ 7 int i; 8 std::string test; 9 }; 10 11 int main() 12 { 13 std::map<int, value*> test_map; 14 for(int i=0; i<10; ++i){ 15 value* tmp = new value(); 16 tmp->i = i; 17 tmp->test = "test"; 18 test_map.insert(make_pair(i, tmp)); 19 } 20 21 for(std::map<int, value*>::iterator it=test_map.begin(); it!=test_map.end();){ 22 std::cout << "first " << it->first << " second " << (it->second)->i <<" "<< (it->second)->test << std::endl; 23 delete it->second; 24 it->second = NULL; 25 //test_map.erase(it); //迭代器失效; 26 test_map.erase(it++); //防止迭代器失效,切记、切记 27 } 28 29 return 0; 30 } 31 32 root@u18:~/cp/test# g++ map3.cpp -g -Wall 33 root@u18:~/cp/test# ls -lt a.out 34 -rwxr-xr-x 1 root root 87224 Jul 9 11:00 a.out 35 root@u18:~/cp/test# valgrind --tool=memcheck --leak-check=full ./a.out 36 ==28426== Memcheck, a memory error detector 37 ==28426== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 38 ==28426== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 39 ==28426== Command: ./a.out 40 ==28426== 41 first 0 second 0 test 42 first 1 second 1 test 43 first 2 second 2 test 44 first 3 second 3 test 45 first 4 second 4 test 46 first 5 second 5 test 47 first 6 second 6 test 48 first 7 second 7 test 49 first 8 second 8 test 50 first 9 second 9 test 51 ==28426== 52 ==28426== HEAP SUMMARY: 53 ==28426== in use at exit: 0 bytes in 0 blocks 54 ==28426== total heap usage: 30 allocs, 30 frees, 930 bytes allocated 55 ==28426== 56 ==28426== All heap blocks were freed -- no leaks are possible 57 ==28426== 58 ==28426== For counts of detected and suppressed errors, rerun with: -v 59 ==28426== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)
时间: 2024-10-30 10:35:40