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 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

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

Windows 2003中巧妙释放内存资源

经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了 Windows 2003 的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件.因为Windows 2003已经自带了一个名为Empty.exe的小程序,它可以用来释放某些应用程序在占用大量内存时不能及时释放的那部分资源,与那些第三方软件内存管理软件不同的是,Empty.exe不会强迫系统全部释放资源,而是仅仅释放必要的资源,这样就不会加重硬盘的负担了. Empty.exe的使用相当简单,命令格式如下: Empty.exe

Linux释放内存的方法

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好.但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了.    Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换).Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作.但是在进行了大量文件操作之后,缓存会把内存资源基本用光.但实际上我们文件操作

Linux 释放内存

Linux虽然是会自动释放内存的,可是有的时候却... 用下面得命令就可以手动释放了,其实只要第一条命令和最后一条命令就可以,不过我不叫无聊所以设置的都运行一遍  sync echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches

解析PHP中的内存管理,PHP动态分配和释放内存

本篇文章是对PHP中的内存管理,PHP动态分配和释放内存进行了详细的分析介绍,需要的朋友参考下   摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够

解析PHP中的unset究竟会不会释放内存

PHP中的unset究竟会不会释放内存?以下我们实例说明一下   首先让我们看一个例子 复制代码 代码如下:     var_dump(memory_get_usage());     $a = "laruence";     var_dump(memory_get_usage());     unset($a);     var_dump(memory_get_usage()); 输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):     int(9044

如何在Win2003中安全的释放内存

  经常看到有朋友在论坛上诉苦说需要释放内存,其实如果你安装了Windows 2003的话,那么并不需要寻求那些需要注册才能长久使用的第三方内存管理软件.因为windows 2003已经自带了一个名为Empty.exe的小程序,它可以用来释放某些应用程序在占用大量内存时不能及时释放的那部分资源,与那些第三方软件内存管理软件不同的是, Empty.exe不会强迫系统全部释放资源,而是仅仅释放必要的资源,这样就不会加重硬盘的负担了win7系统下载.   Empty.exe的使用相当简单,命令格式如下

delphi 内存 释放-delphi 关闭窗体怎么不能释放内存?

问题描述 delphi 关闭窗体怎么不能释放内存? 我有A,B 2个窗体, A是主窗体,运行后占内存是3m, 当我点击A窗体上的按钮创建显示B窗体rilick:=Trilick.Create(Self); rilick.Show;(创建显示代码) 显示后内存到了12m,因为B窗体有一个WebBrowser1载入了一个页面, 当我关闭B窗体(WebBrowser1.Free; FreeAndNil(rilick);)后内存为什么不是3m 而是7m,这是内存泄漏嘛,还是没少释放了什么? 对了 我用的

Dev BarManager控件要通过Remove成员来释放内存

        界面上使用了BarManager控件,会创建DevExpress.XtraBars.BarManager对象.         这些对象被DevExpress.XtraBars.BarAndDockingController的client字段引用,并不会随着界面的关闭而释放内存.         在窗体的关闭事件中调用: BarAndDockingController.RemoveClient(IBarAndDockingControllerClient)移除Client

c++在类的方法中被实例化的对象能自动释放内存么

问题描述 c++在类的方法中被实例化的对象能自动释放内存么 我没有使用new,就是最一般的实例化,如果没有的要怎么释放,求大神教具体的方法 解决方案 没有使用new,就是最一般的实例化,系统会自动释放的. 解决方案二: 当对象的生命周期终止时会自动释放对象所占用的内存. new声明的对象保存在堆中,直到调用delete时生命周期才终止.对象销毁内存被释放. 而直接创建的对象是保存在局部栈中,出了大括号,生命周期就终止了,对象销毁自动释放内存.函数体就是用一个大括号包起来的,函数内声明的对象,出了