map的erase()释放内存

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 [email protected]:~/cp/test# g++ map3.cpp  -g -Wall
33 [email protected]:~/cp/test# ls -lt a.out
34 -rwxr-xr-x 1 root root 87224 Jul  9 11:00 a.out
35 [email protected]:~/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-24 18:51:38

map的erase()释放内存的相关文章

百度地图释放内存最佳答案

解决办法是在- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated中加入了两行代码 [self.map removeFromSuperview]; [self.view addSubview:mapView];然后在以上两行代码后面加载你的UI页面-----记住啦 在移除self.map的同时,重新加载mapView,两行代码就可以达到释放内存的效果. 用Instruments测试显示,之前不能释放的

vector释放内存之swap方法

相信大家看到swap这个词都一定不会感到陌生,就是简单的元素交换.但swap在C++ STL中散发着无穷的魅力.下面将详细的说明泛型算法swap和容器中的swap成员函数的使用! 1. 泛型算法swap swap的函数原型: template <class T> void swap ( T& a, T& b ) { T c(a); a=b; b=c; } vect中swap成员函数实现源码: void swap(vector<_Tp, _Alloc>& __

PHP如何释放内存之unset销毁变量并释放内存详解

PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = str_repeat('1',255); //产生由255个1组成的字符串 $m = memory_get_usage(); //获取当前占用内存 unset($s); $mm = memory_get_usage(); //unset()后再查看当前占用内存 echo $m-$mm; ?> 最后输出u

windows server 2008 大量拷贝后释放内存

管理的服务器中有一台windows 2008,这台服务器最近每天都会拷贝几十万的图片,拷贝量非常大,维护时发现每次拷贝完,操作系统的内存使用都会接近100%,导致没有办法进行其它操作,前几次都通过下班后重启服务器解决,今天仔细查了一下,找到了问题的原因 问题描述: server 2008 r2系统会在进行大量IO操作时,占据大量内存资源,直至内存占满,从而导致系统运行速度变慢. 相关现象:1. 内存占用率90%以上(即是是64G内存,也会占用63.5G)2. 资源管理器中所有进程内存和较低(约1

CentOS5.8 x86_64系统手动释放内存

线上集群后端某台Web服务器,我们观察到+buffers/cache值(即Linux内存的实际使用情况)一直都是5365左右,就算停掉Nginx+FastCGI程序也是一样,考虑到这台机器经常在使用rsync+inotify,肯定会存在着频繁存取文件.而Linux系统有一个特性:在Linux下频繁存取文件时,就会占用物理内存.当程序结束时并不会自动释放被占用的内存,而是一直作为Cache存在.实际上内核结束一个程序后,它是会释放内存的,但是内核并没有立刻将这部分收集到free当中,而是存在在ca

map中erase函数的使用

STL的map表里有一个erase方法用来从一个map中删除掉指令的节点eg:map<string,string> mapTest;typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key);mapTest.erase(iter); 像上面这样只是删除单个节点,map的形为不会出现任务问题,但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念.像下面这样的一个例子

map/vector erase

问题核心:erase之后迭代器是否失效 vector调用erase之后,该迭代器之后的迭代器都失效: map调用erase之后,其他迭代器并不会失效. 1 vector<int> vecData; 2 for (typeof(vecData.begin()) it; it != vecData.end();) 3 { 4 if (*it == 1) 5 { 6 it = vecData.erase(it); 7 //vv.erase(it++); //vector erase之后,it迭代器后

在dll里malloc/new/cvCreate分配内存,在exe里free/Releases释放内存时会出错。

写了个程序,在DLL中用malloc分配了一块内存,但是在exe程序中释放,结果程序crash,原因就是:其原因可能是堆被损坏,这也说明 TestMySticker.exe 中或它所加载的任何 DLL 中有 bug. 以下文字引用自 http://hi.baidu.com/huhe/blog/item/0b422edd1f1563d98c1029a3.html 一个模块一个堆,一个线程一个栈. dll里malloc的内存,在exe里free会出错. CRT(C运行时期库)不是使用进程缺省的堆来实

/MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题

一.MD(d).MT(d)编译选项的区别 1.编译选项的位置 以VS2005为例,这样子打开: 1)         打开项目的Property Pages对话框 2)         点击左侧C/C++节 3)         点击Code Generation节 4)         右侧第六行Runtime Library项目 2.各个设置选项代表的含义 编译选项 包含 静态链接的lib 说明 /MD _MT._DLL MSVCRT.lib 多线程.Release.DLL版本的运行时库 /