c++ map clear相关内存会清空吗
4个回答
展开全部
根据你的问题,我觉得它和下面的问题是等价的:
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的线程安全性做任何承诺
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的线程安全性做任何承诺
展开全部
会清除其中数据的内存,但是map对象本身占用内存是不会清除的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
clear清除了key-value键值对和内容,但如果涉及到在堆上开辟内存的话,这些内存还要程序员手动释放。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
记住C++ 清理 new 关键的内存 只有delete 才能释放。
map 就是一个 模板类而已 会调用析构函数。 你认为它会 写delete吗 答案是不会的。
map 存的是对象可以释放内存。
但是 存的是指针 只能自己释放。
map 就是一个 模板类而已 会调用析构函数。 你认为它会 写delete吗 答案是不会的。
map 存的是对象可以释放内存。
但是 存的是指针 只能自己释放。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询