map 结构怎么释放内存

lvpinging 2010-12-01 08:11:52
map<int,string> test_map;
string aws="你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好";

for(int i=0;i<500000;i++)
{
test_map[i]=aws;
}
cout<<"let me test 1="<<endl;
sleep(5);
map<int,string> a22;

无论是用test_map.swap(a22)
还是

for(int i =0;i<test_map.size();i++)
{
string a;
test_map[i].swap(a);
}
查看了进程内存,却一直不会变小,有啥方法能把内存释放不~
...全文
698 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
v_table 2010-12-04
  • 打赏
  • 举报
回复
map是类似于平衡二叉树的结构
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lvpinging 的回复:]
其实我的意思是 map这个变量,因为条数记录比较大,map【i】的value值也很大,占用的内存很大,我想在一个函数里反复使用,如果不把占用的内存给释放了,会造成系统开销不够
除了在对象生命周期之外释放,就没的别方式了?
new还有del啊。。。
[/Quote]

明白你的想法,想通过在
for(int i =0;i<test_map.size();i++)
{
string a;
test_map[i].swap(a);
}

循环体里循环swap出map里的数据,但是只声明一个string来缓存。

但是你这样做最后的目地,是不是要swap出一个map来存储test_map里的内容,也就是说最后你肯定要占用2个test_map.size()的内存啊。没有意义吧。
再说,根本问题是你500000这个值太大,再怎么折腾也没意义啊。
luciferisnotsatan 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gules 的回复:]

还是找本书学习“对象生命周期”与“对象的构造与析构”的基础知识吧。
[/Quote]
+1
xjy1204 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lvpinging 的回复:]
在aix下,string 初始化就占用了31个字节,有什么办法能将string初始化占用的大小减小?
使用了reservse没有效果~
[/Quote]
强烈建议楼主把基础的东西再好好学习理解一下。。
herman~~ 2010-12-03
  • 打赏
  • 举报
回复
没太明白楼主的本意,不过如果既然提到释放,那证明有些元素是没用的,直接erase 掉就可以了
lvpinging 2010-12-02
  • 打赏
  • 举报
回复
在aix下,string 初始化就占用了31个字节,有什么办法能将string初始化占用的大小减小?
使用了reservse没有效果~
lvpinging 2010-12-02
  • 打赏
  • 举报
回复
其实我的意思是 map这个变量,因为条数记录比较大,map【i】的value值也很大,占用的内存很大,我想在一个函数里反复使用,如果不把占用的内存给释放了,会造成系统开销不够
除了在对象生命周期之外释放,就没的别方式了?
new还有del啊。。。
shangyangi 2010-12-01
  • 打赏
  • 举报
回复
路过,学习的……
qq120848369 2010-12-01
  • 打赏
  • 举报
回复
map内部数据结构是一个一个的结点结构体,map类的析构函数会负责遍历这个树状结构体,析构每一个结点内的数据,并且释放整个结点的内存.
gules 2010-12-01
  • 打赏
  • 举报
回复
还是找本书学习“对象生命周期”与“对象的构造与析构”的基础知识吧。
jixingzhong 2010-12-01
  • 打赏
  • 举报
回复
swap是交换元素,自然不会释放空间。

可以试试erase
Syntax:

#include <map>
void erase( iterator pos );
void erase( iterator start, iterator end );
size_type erase( const key_type& key );The erase method either:

1.erases the element at pos,
2.erases the elements from start to end (but not including end),
3.or erases all elements that have the value of key.
Note that the first version of erase invalidates the iterator pos.


Parameters
todo


Return value
todo


Example
The following code uses erase in a while loop to incrementally clear a map and display its contents in order:

struct strCmp {
bool operator()( const char* s1, const char* s2 ) const {
return strcmp( s1, s2 ) < 0;
}
};

...

map<const char*, int, strCmp> ages;
ages["Homer"] = 38;
ages["Marge"] = 37;
ages["Lisa"] = 8;
ages["Maggie"] = 1;
ages["Bart"] = 10;

while( !ages.empty() ) {
cout << "Erasing: " << ages.begin()->first << ", " << ages.begin()->second << endl;
ages.erase( ages.begin() );
}When run, the above code displays:

Erasing: Bart, 10
Erasing: Homer, 38
Erasing: Lisa, 8
Erasing: Maggie, 1
Erasing: Marge, 37
ayw215 2010-12-01
  • 打赏
  • 举报
回复
变量生命期不结束,无法释放
jixingzhong 2010-12-01
  • 打赏
  • 举报
回复
test_map 析构了就释放了
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

64,686

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧