c++ map clear相关内存会清空吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ map clear相关内存会清空吗?相关的知识,希望对你有一定的参考价值。
根据你的问题,我觉得它和下面的问题是等价的:std::map<T1,T2>模板类,clear成员函数的作用是什么,以及如何影响其控制的内存
下面我来讲讲这一点:
std::map<T1 key,T2 value>::clear()成员函数本身的作用是将map所有的节点都释放,执行完成之后map成为一个空映射表
由于map会释放节点,所以如果节点是对象,而非指针的时候,clear会调用对象的析构函数
在这种情况下,map会释放相关内存的占用
但是如果节点是指针而非对象的时候,情况就比较复杂,因为clear不会主动进行释放指针指向的内存。这个时候需要用户在清理map的时候进行处理
如果指针是指向的常量地址(比如常量字符串、常量数组之类),则可以无需释放
如果指针是指向的对象地址,而这个对象本身是全局对象或者另有程序控制它的生命周期,则也可以无需释放
对于上面两种情况,map的clear可以直接调用无需特别的自定义处理
但是对于指针是通过new、malloc、alloc等方式获取的,而且仅有map获取了持有权,则需要在清理的时候,遍历所有的节点,执行内存释放后,再调用clear
补充几点:
std::map<T1,T2>::iteator 可以像std::list<T>::iteator一样,遍历map的所有节点
作为map的key,请不要使用指针,因为map会将指针作为类似整数一样的处理,而不会调用相关的比较操作,另外key被清理的时候,情况和value一样,参考上面的描述
map并非线程安全的,这点尤其注意 stl并没有对map的线程安全性做任何承诺 参考技术A 会清除其中数据的内存,但是map对象本身占用内存是不会清除的。
Java Map释放内存置null以及调用clear()的区别
今天自己在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢?
Map<Integer, String> map = new HashMap<>();
首先,在创建一个map对象时,map指向堆中新创建的对象,这时候的map是一个没有key和value的空对象。众所周知,
map.hashCode()某种意义上相当返回了对象的地址。所以在用刚创建的map对象调用hashCode()方法:
System.out.println("map.hashCode:"+map.hashCode());
输出结果如下:再看看hashCode()的源码:
通过源码可以发现,hashCode()方法通过获取key和value返回的哈希值进行异或运算后返回结果值,如果key和value值为空则返
回0。此时我们给map对象put值进去,然后再输出一个hashCode()返回的值:
-
map.put(1,"霍去病");
-
map.put(2,"李广");
-
map.put(3,"刘彻");
-
map.put(4,"马邑");
-
map.put(5,"桑弘基");
-
map.put(6,"苏武");
-
System.out.println("新map.hashCode:"+map.hashCode());
返回了一串数字,此时说明map中是有数据的,这个时候我们再使用clear()方法将map中的数据清空后再次输出hashCode()返回
的值,发现仍然是0。
-
map.clear();
-
System.out.println("after clear:"+map.hashCode());
如果直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。
到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,但是内存中map对象还存在,并且map
具有强引用,虽然key和value为空,但是JVM的垃圾回收器并不会回收该对象的内存,如果再程序中创建很多这样子的没
有释放的对象就会造成内存泄漏,所以小伙伴们再创建map对象的时候,如果不再用到该对象的时候,要注意及时释放该对象
的内存空间。有什么写的不好的欢迎大家指出,我及时修改好不误人子弟。
以上是关于c++ map clear相关内存会清空吗?的主要内容,如果未能解决你的问题,请参考以下文章