list erase
场景:list的erase是否把内存也释放掉
list的erase是不是把内存也释放掉?
vector的erase不会释放内存,那么list的erase是不是会释放内存?
------解决方案--------------------
erase不会释放元素中指针指向的空间
------解决方案--------------------
容器中如果存放的是对象指针,不管是哪个容器都不会对指针进行释放的
但是容器中存放的元素占用的空间会释放掉
区别在于vector有管理一块缓冲区域,而list是即用即分配的
------解决方案--------------------
erase 会释放元素占用的空间的.
erase 的参数是迭代器, remove 的参数是元素值, 是不一样的.
------解决方案--------------------
都跟你说啦 “vector有管理一块缓冲区域,而list是即用即分配的” 仔细想想就知道了,vector内存是连续的,list不是连续的,所以vector能做内存缓冲,erase后除非你swap才会shrink,而list则是用到的时候分配,释放的时候去掉
------解决方案--------------------
为什么有remove和erase是因为两个函数参数不同.
remove参数是元素, 即根据元素来移除, 里面需要查找, 然后调用erase.
erase是根据迭代器来移除一个元素.
下面是相关源码:
------解决方案--------------------
没有释放内存的语义. 容器的内存管理策略属于实现细节,因编译器而异. 一般的,基于节点实现的容器(list,map等)的erase会把内存归还到std::alloc.
------解决方案--------------------
元素是指针的话,容器都不会主动去调用指针所指对象的析构,需要自己释放。
------解决方案--------------------
当然会,
总之一条原则, 你 new 的, 你去 delete 释放.
不是你 new 的, 就不该你去释放.
你往 list 里面插入元素时所需的内存是 list 自己申请的, 那它就会自己释放.
不要太执着了, std::alloc 的语义就是内存分配释放.
而且默认的 std::allocator 也就是通过 operator new/delete 来分配释放内存的.
------解决方案--------------------
我的意思:allocator可能是基于内存池的。默认实现因编译器而异。
------解决方案--------------------
这我同意。erase:把指定位置的对象销毁,是否归还容器为此分配的内存则不属于erase的要求。
------解决方案--------------------
为什么都那么啰嗦呢?
其实答案很简单,vector不会,list会。
list的erase是不是把内存也释放掉?
vector的erase不会释放内存,那么list的erase是不是会释放内存?
------解决方案--------------------
erase不会释放元素中指针指向的空间
------解决方案--------------------
容器中如果存放的是对象指针,不管是哪个容器都不会对指针进行释放的
但是容器中存放的元素占用的空间会释放掉
区别在于vector有管理一块缓冲区域,而list是即用即分配的
------解决方案--------------------
erase 会释放元素占用的空间的.
erase 的参数是迭代器, remove 的参数是元素值, 是不一样的.
------解决方案--------------------
都跟你说啦 “vector有管理一块缓冲区域,而list是即用即分配的” 仔细想想就知道了,vector内存是连续的,list不是连续的,所以vector能做内存缓冲,erase后除非你swap才会shrink,而list则是用到的时候分配,释放的时候去掉
------解决方案--------------------
为什么有remove和erase是因为两个函数参数不同.
remove参数是元素, 即根据元素来移除, 里面需要查找, 然后调用erase.
erase是根据迭代器来移除一个元素.
下面是相关源码:
void remove(const _Ty& _Val_arg)
{ // erase each element matching _Val
/* Dinkumware makes a copy of _Val_arg in case it's removed along the way, i.e.
* when the user pass an element of the list as _Val_arg.
*
* We believe that the signature of std::list::remove should be changed
* from remove(const _Ty&) to remove(_Ty) to explicitly indicate that a copy is involved.
*/
const _Ty _Val = _Val_arg; // in case it's removed along the way
iterator _Last = end();
for (iterator _First = begin(); _First != _Last; )
if (*_First == _Val)
_First = erase(_First);
else
++_First;
}
iterator erase(const_iterator _Where)
{ // erase element at _Where
#if _HAS_ITERATOR_DEBUGGING
if (_Where._Mycont != this
------解决方案--------------------
_Where._Ptr == _Myhead)
_DEBUG_ERROR("list erase iterator outside range");
_Nodeptr _Pnode = (_Where++)._Mynode();
_Orphan_ptr(*this, _Pnode);
#else /* _HAS_ITERATOR_DEBUGGING */
_Nodeptr _Pnode = (_Where++)._Mynode();
#endif /* _HAS_ITERATOR_DEBUGGING */
if (_Pnode != _Myhead)
{ // not list head, safe to erase
_Nextnode(_Prevnode(_Pnode)) = _Nextnode(_Pnode);
_Prevnode(_Nextnode(_Pnode)) = _Prevnode(_Pnode);
this->_Alnod.destroy(_Pnode);
this->_Alnod.deallocate(_Pnode, 1);
--_Mysize;
}
return (_Make_iter(_Where));
}
------解决方案--------------------
vector的erase不会释放内存,那么list的erase是不是会释放内存?
没有释放内存的语义. 容器的内存管理策略属于实现细节,因编译器而异. 一般的,基于节点实现的容器(list,map等)的erase会把内存归还到std::alloc.
------解决方案--------------------
元素是指针的话,容器都不会主动去调用指针所指对象的析构,需要自己释放。
------解决方案--------------------
erase 会释放元素占用的空间的.
erase 的参数是迭代器, remove 的参数是元素值, 是不一样的.
list的clear会不会释放元素的内存?
当然会,
总之一条原则, 你 new 的, 你去 delete 释放.
不是你 new 的, 就不该你去释放.
你往 list 里面插入元素时所需的内存是 list 自己申请的, 那它就会自己释放.
vector的erase不会释放内存,那么list的erase是不是会释放内存?
没有释放内存的语义. 容器的内存管理策略属于实现细节,因编译器而异. 一般的,基于节点实现的容器(list,map等)的erase会把内存归还到std::alloc.
不要太执着了, std::alloc 的语义就是内存分配释放.
而且默认的 std::allocator 也就是通过 operator new/delete 来分配释放内存的.
------解决方案--------------------
erase 会释放元素占用的空间的.
erase 的参数是迭代器, remove 的参数是元素值, 是不一样的.
list的clear会不会释放元素的内存?
当然会,
总之一条原则, 你 new 的, 你去 delete 释放.
不是你 new 的, 就不该你去释放.
你往 list 里面插入元素时所需的内存是 list 自己申请的, 那它就会自己释放.
vector的erase不会释放内存,那么list的erase是不是会释放内存?
没有释放内存的语义. 容器的内存管理策略属于实现细节,因编译器而异. 一般的,基于节点实现的容器(list,map等)的erase会把内存归还到std::alloc.
不要太执着了, std::alloc 的语义就是内存分配释放.
而且默认的 std::allocator 也就是通过 operator new/delete 来分配释放内存的.
我的意思:allocator可能是基于内存池的。默认实现因编译器而异。
------解决方案--------------------
我的意思:allocator可能是基于内存池的。默认实现因编译器而异。
内存池也是辅助完成内存的分配释放啊, 它的语义还是表示内存分配释放.
就算是默认的 new/delete, 也没有 delete 就归还给系统, 但是还是把它认为是释放.
把 alloc 的 deallocate 认为是内存释放并没有什么不妥的.
这我同意。erase:把指定位置的对象销毁,是否归还容器为此分配的内存则不属于erase的要求。
------解决方案--------------------
为什么都那么啰嗦呢?
其实答案很简单,vector不会,list会。