为什么调用 std:map:clear 后win7降低运行内存占用用率没有降低

后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 1905|回复: 2
BaiduMap.clear()方法和MapView.onDestroy()方法调用顺序引起的异常
& &在使用V3_3_0_15版本的SDK时候,退出Activity的时候报空指针异常。经检查代码发现,是由于在调用了MapView.onDestroy()方法后,接着调用了BaiduMap.clear()方法,这个时候,就会报空指针异常。
& & debug追踪后发现,调用MapView.onDestroy()方法后,走到BaiduMap.clear()方法时,BaiduMap对象是不为null的,因此具体是什么为null,由于看不到源码所以不知道具体哪个对象是null。
& & 个人猜测,调用MapView.onDestroy()方法,应该也做了清除覆盖物的对象,因此再次调用BaiduMap.clear()方法的时候才会异常。但是MapView.onDestroy()方法为什么没有将BaiduMap对象回收清除致为nul,就不清楚了。以上为个人猜测。希望百度在API文档或者wiki中加以标注说明,例如&如请勿在MapView.onDestroy()方法后调用BaiduMap.clear()方法&或其他之类的说明。l
你好,感谢反馈~& &后续会不断完善相应的注意事项。
& & & & & & & & & & & & mBaiduMap.setMyLocationEnabled(false);
& & & & & & & & & & & & mMapView.onDestroy();
& & & & & & & & & & & & mBaiduMap =
& & & & & & & & & & & & mMapView =
Powered by为什么调用 std:map:clear 后内存占用率没有降低_百度知道
为什么调用 std:map:clear 后内存占用率没有降低
而 C++ 里只有 vector 和 string 这两个符合条件。在 C++11 中可以直接使用 shrink_to_fit();set&#47。2;deque&#47、list/map 等容器是没有 reserve() 和 capacity() 这两个成员函数的,因此 swap 是无用功(除非用户代码使用了定制的 per-object allocator)1、只有含 reserve()/capacity() 成员函数的容器才需要用 swap idiom 来释放空间
其他类似问题
为您推荐:
其他1条回答
list/capacity() 成员函数的容器才需要用 swap idiom 来释放空间;map 等容器是没有 reserve() 和 capacity() 这两个成员函数的,而 C++ 里只有 vector 和 string 这两个符合条件,因此 swap 是无用功(除非用户代码使用了定制的 per-object allocator)。在 C++11 中可以直接使用 shrink_to_fit();deque/set&#47只有含 reserve()&#47
内存占用率的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁为什么调用 std:map:clear 后内存占用率没有降低_百度知道
为什么调用 std:map:clear 后内存占用率没有降低
提问者采纳
map 就是一个 模板类而已 会调用析构函数。 但是 存的是指针 只能自己释放。 map 存的是对象可以释放内存。 你认为它会 写delete吗 答案是不会的记住C++ 清理 new 关键的内存 只有delete 才能释放
来自团队:
其他类似问题
为您推荐:
内存占用率的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁最近在知乎上看到一个问题:
为什么调用 std::map::clear() 后内存占用率没有降低?
size很大的一个map,用完后调用了clear()函数,按说内存使用率应该能降低很多,top命令观察,结果是内存使用率没有降低,为什么呢?
求解答,谢谢。
问题下面已经有很多大神给出了解释。
我的理解是:std::map::clear()之后内存占用会不会降低是由两个方面决定的。
首先是容器使用的空间分配器(allocator)。所有版本的STL都给出了至少两种可用的空间分配器:malloc_allocator和new_allocator。这两个分配器其实分别是对malloc/free和new/delete的封装,引入了相应的异常处理机制而已。显然,使用了这两种分配器的容器在clear()之后已经把内存还给了C的运行环境。SGI STL中设计了二级空间分配器,对于小于128B的内存,将从自己内存池中取,释放时也只是还给内存池,内存池直到进程退出才将申请的内存全部还给运行环境。所以在这种情况下,对于小于128B的内存,clear()后内存占用率不可能降低。然而实际上很多编译器自带的STL空间分配器都默认使用new_allocator,可能出于SGI
STL二级空间分配器效率不高的考虑,至少本人实际测试过的Windows下的msvc和Ubuntu下的gcc都默认使用new_allocator。
其次是不同的C运行时库(glibc,libcpmt,libmsvcprt等等)对于碎片的处理不同,也就是malloc/free的内部实现机制不同。对于较小的内存块,free()并不直接还给操作系统,而是暂时保存起来,以免内存碎片过多。中提到glibc中128kB的内存块将被直接返回给操作系统。由此可见glibc设定的阈值还是比较大的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7645次
排名:千里之外
原创:18篇
(1)(9)(1)(1)(2)(4)(1)(1)(2)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID7479588空间积分0 积分576阅读权限20帖子精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
丰衣足食, 积分 576, 距离下一级还需 424 积分
帖子主题精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
论坛徽章:0
同样一段代码在HPUX上比linux删除操作慢了20多倍,如果map的key换成int,那么性能差不多,请问是什么原因导致的,谢谢。HpUx上的代码使用aCC编译。插入操作性能差不多。
#include &string&
#include &map&
#include &vector&
#include &sys/time.h&
#include &stdio.h&
static struct timeval tm_begin, tm_
#define BEGIN_CALC_TIME gettimeofday (&tm_begin, NULL)
#define END_CALC_TIME gettimeofday (&tm_end, NULL)
#define SHOW_TIME \
& & & & printf (&time: %lu\n&, 1000000 * (tm_end.tv_sec - tm_begin.tv_sec) + (tm_end.tv_usec - tm_begin.tv_usec)); \
} while (0)
& & & & std::map&std::string, int& mapA;
& & & & std::vector&std::string& vecA;
& & & & char key[16];
BEGIN_CALC_TIME;
& & & & for (int i = 0; i & 1000000; ++i) {
& & & & & & & & snprintf (key, 16, &key%d&, i);
& & & & & & & & mapA.insert (std::make_pair (std::string (key), i));
& & & & & & & & vecA.push_back (std::string (key));
END_CALC_TIME;
SHOW_TIME;
& & & & printf (&size: %d\n&, mapA.size ());
& & & & std::vector&std::string&::iterator iter = vecA.begin ();
& & & & std::vector&std::string&::iterator iter_end = vecA.end ();
BEGIN_CALC_TIME;
& & & & for (; iter != iter_ ++iter) {
& & & & & & & & mapA.erase (*iter);
END_CALC_TIME;
SHOW_TIME;
& & & & printf (&size: %d\n&, mapA.size ());
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分369阅读权限20帖子精华可用积分369 信誉积分545 专家积分0 在线时间958 小时注册时间最后登录
稍有积蓄, 积分 369, 距离下一级还需 131 积分
帖子主题精华可用积分369 信誉积分545 专家积分0 在线时间958 小时注册时间最后登录
论坛徽章:0
用int效率差不多,说明问题不在map.
你用string做key, 可能效率差在string的实现上.
UID7479588空间积分0 积分576阅读权限20帖子精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
丰衣足食, 积分 576, 距离下一级还需 424 积分
帖子主题精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
论坛徽章:0
谢谢。我也觉得不是红黑树实现的问题,我还有一个测试程序,使用字符串作为key,性能也是差距巨大,最少十倍,开始怀疑是strcmp两个平台性能差距大,经过测试HP上要比linux还稍微快点。
#include &map&
#include &vector&
#include &list&
#include &stdio.h&
#include &string&
#include &string.h&
#include &sys/time.h&
#include &stdio.h&
static struct timeval tm_begin, tm_
#define BEGIN_CALC_TIME gettimeofday (&tm_begin, NULL)
#define END_CALC_TIME gettimeofday (&tm_end, NULL)
#define SHOW_TIME \
& & & & printf (&time: %lu\n&, 1000000 * (tm_end.tv_sec - tm_begin.tv_sec) + (tm_end.tv_usec - tm_begin.tv_usec)); \
} while (0)
struct IdxClient_key
& & & & char ClientId[16];
& & & & bool operator & (const IdxClient_key& s) const
& & & & & & & &
& & & & & & & & ret = strcmp (ClientId, s.ClientId);
& & & & & & & & if (ret & 0) {
& & & & & & & & & & & &
& & & & & & & & }
& & & & & & & &
class ST_Client
& & & & ST_Client ()
& & & & & & & & memset (this, 0, sizeof (ST_Client));
& & & & char ClientId[16];
& & & & char OpenDate[8];
main (int argc, char *argv[])
& & & & int i = 0;
& & & & std::map&IdxClient_key, ST_Client *& mapA;
& & & & std::vector&IdxClient_key& vecA;
& & & & IdxClient_
& & & & vecA.reserve (1000000);
& & & & for (i = 0; i & 1000000; ++i) {
& & & & & & & & ST_Client *p = new ST_C
& & & & & & & & snprintf (p-&ClientId, 16, &cid%d&, i);
& & & & & & & & /// snprintf (p-&MemberId, 9, &%d&, i);
& & & & & & & & snprintf (p-&OpenDate, 8, &&);
& & & & & & & & memcpy (key.ClientId, p-&ClientId, 16);
& & & & & & & & mapA.insert (std::make_pair (key, p));
& & & & & & & & vecA.push_back (key);
& & & & printf (&table size: %d\n&, mapA.size ());
& & & & std::vector&IdxClient_key&::iterator iter = vecA.begin ();
& & & & std::vector&IdxClient_key&::iterator iter_end = vecA.end ();
BEGIN_CALC_TIME;
& & & & for (; iter != iter_ ++iter) {
& & & & & & & & std::map&IdxClient_key, ST_Client *&::iterator ret = mapA.find (*iter);
& & & & & & & & if (ret == mapA.end ()) {
& & & & & & & & & & & & printf (&find error.\n&);
& & & & & & & & & & & & return -1;
& & & & & & & & }& & & & & & & &
& & & & & & & & mapA.erase (ret);
END_CALC_TIME;
SHOW_TIME;
& & & & printf (&table size: %d\n&, mapA.size ());
UID空间积分0 积分7418阅读权限70帖子精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
富足长乐, 积分 7418, 距离下一级还需 582 积分
帖子主题精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
论坛徽章:0
本帖最后由 wwwsq 于
12:58 编辑
std::string会很愚蠢的进行很多malloc和memcpy的动作。
linux对malloc进行了很多优化,hpux可能是malloc不够好。在hpux下使用std::string,可以尝试一下google的tcmalloc
有个签名貌似帖子好看一点
UID空间积分0 积分492阅读权限20帖子精华可用积分492 信誉积分124 专家积分0 在线时间26 小时注册时间最后登录
稍有积蓄, 积分 492, 距离下一级还需 8 积分
帖子主题精华可用积分492 信誉积分124 专家积分0 在线时间26 小时注册时间最后登录
论坛徽章:0
wwwsq 发表于
std::string会很愚蠢的进行很多malloc和memcpy的动作。
linux对malloc进行了很多优化,hpux可能是malloc ...
为啥非要用string类,想不明白
UID空间积分0 积分7418阅读权限70帖子精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
富足长乐, 积分 7418, 距离下一级还需 582 积分
帖子主题精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
论坛徽章:0
doswin 发表于
为啥非要用string类,想不明白
在对性能无所谓的时候,std::string还是蛮方便的。
有个签名貌似帖子好看一点
UID7479588空间积分0 积分576阅读权限20帖子精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
丰衣足食, 积分 576, 距离下一级还需 424 积分
帖子主题精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
论坛徽章:0
keep_silence
& & 谢谢各位,string作为key,只是演示一下,请看第二段程序,使用字符串作为key,性能差距还是很大。
UID空间积分0 积分492阅读权限20帖子精华可用积分492 信誉积分124 专家积分0 在线时间26 小时注册时间最后登录
稍有积蓄, 积分 492, 距离下一级还需 8 积分
帖子主题精华可用积分492 信誉积分124 专家积分0 在线时间26 小时注册时间最后登录
论坛徽章:0
keep_silence 发表于
回复 2# hgrany
谢谢。我也觉得不是红黑树实现的问题,我还有一个测试程序,使用字符串作为key,性能也 ...
strcmp....简简单单的几行代码,没你说的那么恐怖。
倒是c++的类实现可能有问题是真的。
UID空间积分0 积分7418阅读权限70帖子精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
富足长乐, 积分 7418, 距离下一级还需 582 积分
帖子主题精华可用积分7418 信誉积分698 专家积分10 在线时间790 小时注册时间最后登录
论坛徽章:0
keep_silence 发表于
回复 1# keep_silence
map.set会malloc内存去构造IdxClient_key对象。
map.erase会释放IdxClient_key对象。
linux对内存释放也做了优化。。。。和malloc一起做的。。。。
有个签名貌似帖子好看一点
UID7479588空间积分0 积分576阅读权限20帖子精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
丰衣足食, 积分 576, 距离下一级还需 424 积分
帖子主题精华可用积分576 信誉积分136 专家积分0 在线时间17 小时注册时间最后登录
论坛徽章:0
有可能是这个问题,下面这个程序,HP比linux慢5倍,我按照这个思路再试试,谢谢了
#include &map&
#include &vector&
#include &list&
#include &stdio.h&
#include &string.h&
#include &sys/time.h&
#include &stdio.h&
static struct timeval tm_begin, tm_
#define BEGIN_CALC_TIME gettimeofday (&tm_begin, NULL)
#define END_CALC_TIME gettimeofday (&tm_end, NULL)
#define SHOW_TIME \
& & & & do {\
& & & & & & & && &&&printf (&time: %lu\n&, 1000000 * (tm_end.tv_sec - tm_begin.tv_sec) + (tm_end.tv_usec - tm_begin.tv_usec)); \
& & & & } while (0)
class ST_Client
& & & & public:
& & & & & & & & ST_Client ()
& & & & & & & & {
& & & & & & & & & & & & memset (this, 0, sizeof (ST_Client));
& & & & & & & & }
& & & & & & & & char ClientId[16];
& & & & & & & & char OpenDate[8];
& & & & std::vector&ST_Client& vecA;
& & & & ST_C
BEGIN_CALC_TIME;
& & & & for (int i = 0; i & 1000000; ++i) {
& & & & & & & & vecA.push_back (client);
& & & & while (! vecA.empty ()) {
& & & & & & & & vecA.pop_back ();
END_CALC_TIME;
SHOW_TIME;
& & & & printf (&size: %d\n&, vecA.size ());

我要回帖

更多关于 如何降低win7内存占用 的文章

 

随机推荐